aem - SlingModel 中的异常处理并在 AEM 中使用 Pojo?

标签 aem sling sling-models

我的问题很简单。 我们应该还是不应该处理/捕获 Sling Models/WCMUsePojos 中的异常?

详细信息:

我们有几个 SlingModel 正在调用 OSGi 服务方法,当抛出任何异常时,我们会将其捕获到 SlingModel,然后我们在模型 @PostConstruct 方法中执行操作

slingHttpResponse.sendError(500);

这似乎对我们不起作用,响应状态为 500(在浏览器的网络选项卡中检查),但页面仍然加载,而不是加载我们设置的 500.jsp 页面或“内部服务器错误页面” .

事实上,对我们有用的是将异常重新抛出到默认处理程序。 这样就成功加载了 500.jsp 页面。

例如。

@PostConstruct // THIS WORKS
public void init() throws Exception{
   try{
     // Business Logic calling Injected OSGi Service Methods
   }
   catch(Exception e){
     // Log exception and rethrow
     LOG.error("Exception in Model",e);
     throw e;
   }
}

上面的实现是否理想?这适用于而不是下面的代码,它不适用于我们

 @PostConstruct  // THIS DOES NOT WORK PROPERLY
    public void init() throws Exception{
       try{
         // Business Logic calling Injected OSGi Service Methods
       }
       catch(Exception e){
         // Log exception and SEND ERROR
         LOG.error("Exception in Model",e);
         slingHttpResponse.sendError(500);
       }
    }

最佳答案

在普通页面中,请求和响应对象会被大多数 SlingFilter 甚至 HTL 本身包装多次。其中许多实现只是获取响应的输出,而忽略其余部分(例如 http header 、状态代码、请求属性……)。

如果您进行简单的测试(仅通过渲染组件),您会发现这两种方法都有效。如果您在普通核心组件页面中执行此操作,那么您仍然会得到 500,但页面和组件已经呈现。

你必须接受异常(exception)。缺点是,它可能会将内部结构暴露给最终用户。这是一个重大的安全风险。

但请查看 AEM Commons 中的“组件错误处理程序”。根据运行模式,它可以用另一个 HTML 片段替换该组件。

https://adobe-consulting-services.github.io/acs-aem-commons/features/component-error-handler/index.html

关于aem - SlingModel 中的异常处理并在 AEM 中使用 Pojo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58265727/

相关文章:

aem - 吊带模型 : Can I inject the SlingHttpServletRequest when adapting from Resource?

java - 吊带型号的用途

java - 吊索@Inject NullPointerError,当@Reference成功时

aem - SlingAuthenticationHandler 如何与 CRXLogin 模块对话

java - AEM 性能问题(缓慢的内存泄漏)org.slf4j.helpers.BasicMarker 和 org.slf4j.helpers.BasicMarkerFactory

java - 当从某个组件创建页面时,我可以以编程方式创建额外的页面吗?

jackrabbit - 是否可以通过 GUID 访问节点?

html - JSP内容一目了然

aem - 需要帮助解决和理解 com.adobe.granite.csrf.impl.CSRFFilter doFilter : the provided CSRF token is invalid in AEM 6. 1