对不起,可能是另一个非常基本的问题。在我的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>
答案 0 :(得分:2)
你是由CDI管理bean,而不是由JSF管理。 JSF @ViewScoped
注释仅适用于JSF @ManagedBean
,而不适用于CDI @Named
。在CDI @Named
上,您只能使用CDI范围,而不能使用JSF范围。 CDI提供的最接近的是@ConversationScoped
。但是你要用一些额外的样板代码来管理对话的开始和结束。
同样的故事适用于JSF @ManagedProperty
注释。它仅适用于JSF @ManagedBean
,而不适用于CDI @Named
。对于CDI,您应该使用@Inject
或custom HTTP param annotation。
JSF问题2266 无关到这一切。
答案 1 :(得分:1)
我有一个非常相似(如果不准确)的问题。 我在Glassfish 4.0 build 89和Primefaces 4.0上使用Java EE 7。 Glassfish报道称它正在使用Mojarra 2.2.0。 我正在使用CDI类型的注释,即@Named和@javax.faces.view.Viewscoped。 我的* .xhtml文件就是这样开始的
<?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:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewAction action="#{personController.initialise}" />
<f:viewParam name="id" value="#{personController.id}" />
</f:metadata>
...
无论我尝试过什么,它都不会设置我的视图参数。 我读到Mojarra 2.2.1存在问题,并认为它可能与Mojarra 2.2.0相同。 Updatetool没有比我更新更新Mojarra,所以我手动完成了。 我将http://repo1.maven.org/maven2/org/glassfish/javax.faces/2.2.5/中最新的Mojarra实现的副本放到$ GLASSFISH_HOME / glassfish / modules目录中,将其重命名为javax.faces.jar并备份现有的javax.faces.jar文件。 重新启动Glassfish,据报道它现在正在使用Mojarra 2.2.5。问题消失了,代码运行良好。