FacesConverter为null(JSF 2.3,CDI 2.0)

问题描述 投票:1回答:1

我尝试设置一个FacesConverter以通过JSF规范中引用的我的JSF页面显示某些实体。

我正在运行以下内容:-Open Liberty 19.0.0.11(也在19.0.0.6上进行了测试,不要问我为什么使用这个版本,我随机选择了另一个版本)-Java Open JDK 13-JSF 2.3-CDI 2.0

我已将以下web.xml添加到我的项目中:

<web-app id="WebApp_ID" version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
    <display-name>TestConverterInjection</display-name>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <enabled>true</enabled>
        <async-supported>false</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>
        *.xhtml</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

以下faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
    version="2.3">

</faces-config>

以下bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
    bean-discovery-mode="all" 
    version="2.0">
</beans>

我确实有一个AppConfig类,带有@FacesConfig(Version.JSF_2_3)注释。到目前为止一切正常。

我已经将简单的TestConverter注释为:

@FacesConverter(value = "testConverter", managed = true)

查看BeanManager时,我的TestConverter似乎可用,因为它出现在列表中。

我的test.xhtml文件看起来像这样:

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:ui="http://java.sun.com/jsf/facelets"> 


    <h:outputText value="#{testBean.selectedEntity.id}">    
    </h:outputText>
    <br/>
    <h:outputText value="#{testBean.selectedEntity}" converter="testConverter">    
    </h:outputText>
</html>

还有我的后援豆:

package com.test.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.util.AnnotationLiteral;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import com.test.entities.MyEntity;

@Named("testBean")
@ViewScoped
public class TestBean implements Serializable {

    private List<MyEntity> listEntities;

    private MyEntity selectedEntity;

    @Inject private BeanManager beanManager;

    @PostConstruct
    public void init() {

        this.listEntities = new ArrayList<MyEntity>();

        for(int i = 0; i < 5; i++) {
            this.listEntities.add(new MyEntity(i, "test_"+i, i+"_test"));
        }

        this.selectedEntity = this.listEntities.get(0);

        Set<Bean<?>> beans = beanManager.getBeans(Object.class,new AnnotationLiteral<Any>() {});
        for (Bean<?> bean : beans) {       
            System.out.println("bean: "+bean.getBeanClass().getName());
        }       
    }

    public List<MyEntity> getListEntities() {
        return listEntities;
    }

    public void setListEntities(List<MyEntity> listEntities) {
        this.listEntities = listEntities;
    }

    public MyEntity getSelectedEntity() {
        return selectedEntity;
    }

    public void setSelectedEntity(MyEntity selectedEntity) {
        this.selectedEntity = selectedEntity;
    }       

}

应该没事吧?好吧,至少它可以与Apache TomEE 8.0.0 PluME一起使用。但是在“开放自由”上,我得到:

SRVE0777E:应用程序类'javax.faces.webapp.FacesServlet.service:236'中的例外javax.servlet.ServletException:在javax.faces.webapp.FacesServlet.service(FacesServlet.java:236)在com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1255)在[内部课程]造成原因:java.lang.NullPointerException:在org.apache.myfaces.cdi.converter.FacesConverterCDIWrapper.getAsString(FacesConverterCDIWrapper.java:62)...另外1个

因此,看来我的bean已实例化,但为空。...Open Liberty的功能是javaee8-0(确保没有丢失任何东西)。在上面的示例中,如果要在转换器中删除“ managed = true”,则它可以正常工作。 CDI中存在一些错误?

cdi myfaces open-liberty jsf-2.3
1个回答
0
投票

我想发表评论,但我的信誉点还不够。 :(

我尝试通过提供的代码复制您的应用程序,但是在测试时,无论是在19.0.0.6还是在19.0.0.11(使用MyFaces 2.3.4)中都没有得到该错误。

请您分享更多代码或提供一个可重现该错误的示例应用程序?

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.