当前位置: 首页 > 面试题库 >

在ViewScoped bean中未设置viewParam值

穆阳炎
2023-03-14
问题内容

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

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

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

请帮忙,这是我的豆子(我尝试过使用“ ManagedProperty”注释,也可以不使用“ 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批注@ManagedBean仅适用于JSF ,不适用于CDI
@Named。在CDI上,@Named您只能使用CDI范围,而不能使用JSF范围。CDI提供的最接近的是@ConversationScoped。但是,您必须自己管理一些对话的开始和结束,并附带一些其他样板代码。

同样的情况适用于JSF @ManagedProperty注释。它@ManagedBean仅适用于JSF ,不适用于CDI
@Named。对于CDI,应使用@Inject或自定义HTTP参数注释。

JSF问题2266 这一切 无关



 类似资料:
  • 我在JavaFx应用程序中有一个名为choiceBoxPizza的ChoiceBox。 在我的控制器中,我声明它: 我包含一些测试数据的函数是: 所以应该用填充。奇怪的是,我没有得到任何异常,并且选择框在调用方法后仍然为空。 我的逻辑有错误吗?

  • 问题内容: 我已经安装了android bundle,并且我已经在.bashrc文件中配置了所有内容,甚至当我在命令行中说android时。我正在获取android管理器..但是当我说离子平台添加android时,我总是会收到错误提示为“错误:ANDROID_HOME未设置,并且路径中未包含“ android”命令。您必须至少满足以下条件之一。” 。我尝试了很多方法,但是问题没有解决。 我的平台:

  • 我在表中为某些列设置了默认值。例如,create_time我已经设置了CURRENT_TIMESTAMP。当我通过JPA插入一个对象时,我没有得到该列的默认值。是否有任何命令可以执行此操作?

  • 我有一个@OneToOne关系映射。我可以获取记录并查看关系,但我无法创建记录并保留外键。目前,当在父表(FacilityGeneral)中创建新记录时,我也会在子表(FacilityLocation)中创建新记录,但是,子表中的外键不会自动创建。 我试图通过编程将创建为父表(FacilityGeneral)中主键的序列值分配给子表中的不同字段来持久化它,但由于序列#在对象持久化之前不会生成,因此

  • 问题内容: 我尝试使用下面的代码将命令输出存储在数组中,但是在“ while循环”之后无法打印数组元素,这意味着在代码的最后一行中,我的代码是否存在任何问题? 问题答案: 问题是您在 子 外壳中添加了元素。详细说明: 导致在子shell中执行,这是一个单独的执行环境。这意味着设置的变量不适用于 当前 外壳,其执行环境不会受到影响。您可以改为使用流程替代来实现相同目的: 请注意,不建议解析。尝试使用

  • 我将设置为,并将其添加到我的。当我运行和echo,它们都给了我正确的信息。但是,当我运行libgdx安装程序时,它会给出以下错误:<code>错误:未设置JAVA_HOME,并且在路径中找不到任何“JAVA”命令。 请在您的环境中设置JAVA_HOME变量,以匹配您的JAVA安装位置。 有什么想法吗?