2017-08-14 48 views
3

有以下代碼片段:更改faces-config.xml中從2.2至2.3的原因javax.el.PropertyNotFoundException:目標不可達,識別符 '豆' 解析爲空

豆:

import javax.faces.view.ViewScoped; 
import javax.inject.Named; 

@Named(value = "directoryBean") 
@ViewScoped 
public class DirectoryBean implements Serializable { 

private static final long serialVersionUID = 1L; 
    .... 
} 

面-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> 

group.xhtml

<ui:composition ...> 

    <f:metadata> 
     <f:viewParam name="id" value="#{directoryBean.id}" /> 
    </f:metadata> 

</ui:composition> 

在結果得到異常:

javax.el.PropertyNotFoundException: /group.xhtml @6,64 value="#{directoryBean.id}": Target Unreachable, identifier 'directoryBean' resolved to null 

得到它從版本2.2改變faces-config.xml中爲版本2.3句法之後。

含義,與faces-config.xml中有以下內容一切正常:部署似鯖水狼牙魚4.1.2.172(全)服務器上,也

<faces-config version="2.2" 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_2.xsd"> 
.... 
</faces-config> 

JSF 2.3.2加入的pom.xml與「提供」範圍。

.... 
<dependencies> 
    ... 
    <dependency> 
     <groupId>org.glassfish</groupId> 
     <artifactId>javax.faces</artifactId> 
     <version>2.3.2</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.faces</groupId> 
     <artifactId>javax.faces-api</artifactId> 
     <version>2.3</version> 
     <scope>provided</scope>    
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 
    ... 
</dependencies> 
.... 

我已經檢查了所有的解決方案,我才能夠在幾個小時找到,包括不同版本的beans.xml的:

  1. 最初的beans.xml是不存在的項目 - 問題 堅持;
  2. 添加空beans.xml - 問題持續;
  3. 添加beans.xml,其中包含bean-discovery-mode的兩個不同選項 - 「all」 和「註釋」 - 問題依然存在; \ WEB-INF \ beans.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_1_1.xsd" 
     bean-discovery-mode="all"> 
</beans> 

在測試了似鯖水狼牙魚4.1.2.172,GlassFish的5(java的版1.8.0_144)的本地實例,和似鯖水狼牙魚4.1的遠程實例.2.172(java ver 1.8.0_131)。

謝謝!

注意:像這樣的https://github.com/AnghelLeonard/JSF-2.3/tree/master/JSF23InjectInConverterValidator這樣的示例項目會給出相同的錯誤。

+0

你只需要改變的面孔,配置?這意味着你已經在JSF 2.3.2發行版中,只是改變了faces-config? – Kukeltje

+1

是的,確切!將faces-config恢復爲JSF 2.2語法 - 解決了這個問題。 –

+0

一個小的快速谷歌搜索結果中的:https://stackoverflow.com/questions/44064995/jsf-2-3-not-finding-my-named-cdi-1-2-managed-bean。你是否也在使用「外部」JSF庫?一個在你的webapp中提供? – Kukeltje

回答

1

我想發佈一個完整的解決方案,應該做什麼才能使JSF 2.3庫在JSF v2.3模式下工作。以下代碼示例基於GlassFish 5.0服務器環境。 1)至少將JSF庫升級到版本2.3.3(它修復了與jsf 2相關的一些錯誤。3模式激活)

2)beans.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> 

3)faces-config.xml應該像:

<?xml version='1.0' encoding='UTF-8'?> 
<faces-config version="2.3" 
      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"> 
    .... 
</faces-config> 

4)和關鍵球員在這一切的設置 - 是特別是形成實際激活JSF 2.3模式的Java類,在我的情況下,它的名字Jsf23Activator和空空如也的內容:

package ua.local.beans; 

import javax.enterprise.context.ApplicationScoped; 
import javax.faces.annotation.FacesConfig; 

@ApplicationScoped 
@FacesConfig(version = FacesConfig.Version.JSF_2_3) 
public class Jsf23Activator { 

} 

註釋@FacesConfig(version = FacesConfig.Version.JSF_2_3)加一次每個項目,沒有必要添加了好幾遍。

基本上需要添加這個註解被其他人多次提到,但在我的情況下,它不工作,直到我通過添加註釋@ApplicationScoped將這個類聲明爲CDI bean。只有在我將該類聲明爲CDI bean後,清除了項目/重新啓動的服務器 - JSF 2.3模式最終被激活,現在我能夠注入JSF類/利用其他JSF 2.3功能!

謝謝!

0

在DirectoryBean加入這一行:

// Activates CDI build-in beans 
@FacesConfig(
     version = JSF_2_3 
) 

,並在beans.xml變化豆的發現模式爲 「全部」。 faces-config.xml設置版本2.3

+0

你從哪裏得到這些信息?你有鏈接嗎?我對更多細節感興趣。謝謝 – Kukeltje

+0

謝謝! @Kukeltje我們在這裏對這個主題進行了廣泛的討論:https://github.com/javaserverfaces/mojarra/issues/4264 –

相關問題