gpt4 book ai didi

java - @PostConstruct 中抛出的异常导致 JSF 2.1 中的 IllegalStateException

转载 作者:行者123 更新时间:2023-11-29 06:01:49 26 4
gpt4 key购买 nike

我的@ViewScoped mananged bean 上有一个初始化方法。在后期构造中,我从数据库加载数据。我有一个自定义的 ExceptionHandlerWrapper 来捕获所有异常并发送到错误页面。但是,当 @PostConstuct 抛出异常时,我收到 IllegalStateException 并且没有重定向到错误页面。我尝试了很多组合.....

我在我的 ExcpetionHandler 中尝试过这个

externalContext.getRequestMap().put(ERROR_BEAN_ID, ERROR_TEXT);
externalContext.dispatch(ERROR_PAGE);
fc.responseComplete();

下面这一行是我原来的。它也没有工作

externalContext.getFlash().put(ERROR_BEAN_ID, ERROR_TEXT);
nav.handleNavigation(fc, null, ERROR_PAGE);
fc.renderResponse();

这些都会导致IllegalStateExceptions。我也调用了重定向,结果相同。

你能在全局范围内捕获从@PostConstruct 抛出的错误吗?

最佳答案

These all cause IllegalStateExceptions.

对于消息“响应已提交”,我假设?好吧,这是一个不归路。响应的一部分已经发送到客户端(网络浏览器)。不可能取回已经发送的字节。服务器将在日志中出现此异常,而客户端将以不完整的响应结束。

你能做什么?

最直接的方法是将响应缓冲区大小扩大到最大页面的大小。例如,64KB:

<context-param>
<param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
<param-value>65536</param-value>
</context-param>

它默认为 ~2KB,具体取决于服务器配置。您只需要记住,当您的服务器必须处理相对大量的请求/响应时,这可能会占用内存。正确配置和测量。

另一种方法是在呈现/提交响应之前引用bean,以便在该点之前触发它的(后期)构造。也许有问题的 bean 在 View 的最底部第一次被引用,远远超过 ~2KB 响应大小边界。你可以接管@PostConstruct的工作用<f:event type="preRenderView">在 View 顶部的某个地方。例如

<f:event type="preRenderView" listener="#{bean.init}" />

public void init() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// Do here your original @PostConstruct job.
}
}

关于java - @PostConstruct 中抛出的异常导致 JSF 2.1 中的 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com