我的问题很简单。 我们应该还是不应该处理/捕获 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 片段替换该组件。
关于aem - SlingModel 中的异常处理并在 AEM 中使用 Pojo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58265727/