Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SlingModels中的异常处理和AEM中的POJO使用?_Aem_Sling_Sling Models - Fatal编程技术网

SlingModels中的异常处理和AEM中的POJO使用?

SlingModels中的异常处理和AEM中的POJO使用?,aem,sling,sling-models,Aem,Sling,Sling Models,我的问题很简单我们是否应该处理/捕获吊索模型/WCMUSEPOJO中的异常? 详细信息: 我们有几个SlingModels正在调用OSGi服务方法,当抛出任何异常时,我们会将其直接捕获到SlingModel,然后在model@PostConstruct方法中执行 slingHttpResponse.sendError(500); 这似乎对我们不起作用,响应状态为500(在浏览器的“网络”选项卡中选中),但页面无论如何都会加载,而不是加载我们的500.jsp页面或设置的“内部服务器错误页面” 事

我的问题很简单我们是否应该处理/捕获吊索模型/WCMUSEPOJO中的异常?

详细信息:

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

slingHttpResponse.sendError(500);
这似乎对我们不起作用,响应状态为500(在浏览器的“网络”选项卡中选中),但页面无论如何都会加载,而不是加载我们的500.jsp页面或设置的“内部服务器错误页面”

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

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

 @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);
       }
    }

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

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

你必须带着例外去。缺点是,它可能向最终用户公开内部构件。这是一个重大的安全风险

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


如果您可以更优雅地处理错误,则不希望发送状态代码500。这可能会导致发布服务器的高负载并破坏用户体验,因为默认情况下不会缓存错误页面。更好的方法是配置监控,并在出现故障时获取通知,以便及时修复故障。在大多数情况下,一个组件不应成为断页的原因。最坏的情况是关于必须显示的数据的法律要求,这可能需要非常复杂的错误处理。如果一个组件损坏,我们需要整个页面显示500页,这是我们的要求。如果您阅读了关于response.sendError wrt AEM的文档,它会说(请在没有链接的地方阅读),“清除响应缓冲区(即异常之前提交的所有内容,例如另一个jsp/htl文件内容)并重置响应和请求,并执行RequestDispatcher.forward to Whatever错误页面的配置(默认或由ACS commons配置)。“然后,您必须在呈现之前计算页面的状态,例如在Sling筛选器中。调用slingHttpResponse.sendError(500)基本上太晚了,因为响应部分呈现。为了确保性能安全,您可以只在发布服务器上执行筛选器,或者只计算一次状态并将其传递给模型,这些模型只是从“只读”状态对象中读取。无论异常是否会发生,我只能判断模型何时执行。如何在过滤器中预先确定异常是否会出现。我需要更多关于@FlorianSalihovic的详细信息,可以在你如何处理模式中的异常的答案部分中找到。如果你看到这个家伙在处理模型错误。在他的模型示例中,他只是将所有异常抛出到Models PostConstruct方法中的默认处理程序中。稍后我将画出一些东西,因为我现在在办公室。响应缓冲区大小可以通过“基于Apache Felix Jetty的Http服务”中的OSGi配置进行设置。默认情况下,这是24kb,对于大多数测试页面来说,这通常足够了。所以通常情况并非如此。此外,您将得到一个IOException,即响应已刷新。您肯定会在error.log中看到这一点。我会再说一遍,当单个组件出现故障时,我们需要整个页面都关闭。因此,我认为组件处理程序对我们没有任何用处。仍然感谢您的帮助。@Oliver上面提到的组件错误处理程序已经回答了这个问题。将该异常抛出到sling是解决整个页面错误的唯一方法。
 @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);
       }
    }