gpt4 book ai didi

java - 未在 ViewScoped bean 中设置 viewParam 值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:57:30 25 4
gpt4 key购买 nike

抱歉,可能是另一个非常基本的问题。在我的 ViewScoped bean 中,“viewParam”看起来已经设置好了,但是当我开始使用它时,它的值为 null。我在 setter (setEventId()) 中放置了一个断点,它获得了值,但是在我的 preRenderView 指定的方法中,它消失了,所以我无法加载我试图检索的 Event 对象。

当我的 bean 是 RequestScoped 时,这工作正常,但我发现在 POST 和随后的验证错误中,我的所有详细信息都丢失了,并且阅读 ViewScoped 是解决此问题的方法。

我已经升级到 Mojarra 2.1.7,因为我认为这可能是一个错误,并且确实在他们的 JIRA 中列出了一个“严重错误”,并在 2.1.7 中修复了,但我在 Glassfish 日志中验证了它是使用较新的版本,我仍然遇到同样的问题:http://java.net/jira/browse/JAVASERVERFACES-2266

请帮忙,这是我的 bean(我尝试过使用和不使用 'ManagedProperty' 注释)

@ViewScoped
@Named
public class EventController extends AbstractController {

private static final Logger logger = Logger.getLogger("EventController");

/**
* Request param managed property
*/
@ManagedProperty(value="#{param.eventId}")
private Long eventId;

private Event event = new Event();

/**
* The event dao
*/
@Inject
private EventDao eventDao;

/**
* Load the event (requires eventId has a value)
* @return
*/
public void loadEvent() {
event = eventDao.find(eventId);
}

/**
* @return the eventId
*/
public Long getEventId() {
return eventId;
}

/**
* @param eventId the eventId to set
*/
public void setEventId(Long eventId) {
this.eventId = eventId;
}
}

这是我在“listEvents”页面中构建链接的方式

<h:link value="Full details" outcome="/calendar/viewEvent" includeViewParams="true">
<f:param name="eventId" value="#{calendarController.event.eventId}" />
</h:link>

这是需要 eventId 属性的页面

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">

<body>

<ui:composition template="/WEB-INF/templates/standardTemplate.xhtml">

<f:metadata>
<f:viewParam name="eventId" value="#{eventController.eventId}"/>
<f:event type="preRenderView" listener="#{eventController.loadEvent}" />
</f:metadata>

<ui:define name="content">

<h1>Event details for: #{eventController.event.title}</h1>
<h:form>
<p:messages/>

<p:panelGrid style="margin-top:20px">
<f:facet name="header">
<p:row>
<p:column colspan="4">Event details</p:column>
</p:row>
</f:facet>

<p:row>
<p:column>
Title
</p:column>
<p:column colspan="3">
<p:inputText value="#{eventController.event.title}" size="49"/>
<h:inputHidden id="eventId" value="#{eventController.event.eventId}"/>
</p:column>
</p:row>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>

最佳答案

您通过 CDI 而不是 JSF 来管理 bean。 JSF @ViewScoped 注释仅适用于 JSF @ManagedBean,不适用于 CDI @Named。在 CDI @Named 上,您只能使用 CDI 范围,而不能使用 JSF 范围。 CDI 提供的最接近的是 @ConversationScoped .但是您必须使用一些额外的样板代码自行管理对话的开始和结束。

同样的故事也适用于 JSF @ManagedProperty 注释。它仅适用于 JSF @ManagedBean,不适用于 CDI @Named。对于 CDI,您应该使用 @Injectcustom HTTP param annotation .

JSF 问题 2266 与这一切无关

关于java - 未在 ViewScoped bean 中设置 viewParam 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10583337/

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