[英]JSF 2 inject Spring bean/service with @ManagedProperty and no xml
[英]NullPointerException on inject managedProperty on bean
環境:
我試圖在 bean 中注入一個 ManagedProperty 並且我得到一個 NullPointerExcepion 但我不知道為什么會這樣。 缺少什么?
錯誤日志
21:35:25,994 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-8) Error Rendering View[/index.xhtml]: java.lang.NullPointerException
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.ManagedPropertyProducer.evaluateExpressionGet(ManagedPropertyProducer.java:87)
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.ManagedPropertyProducer.lambda$new$0(ManagedPropertyProducer.java:60)
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.CdiProducer.create(CdiProducer.java:105)
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.ManagedPropertyProducer.create(ManagedPropertyProducer.java:38)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.contexts.unbound.DependentContextImpl.get(DependentContextImpl.java:64)
...
21:35:26,001 ERROR [io.undertow.request] (default task-8) UT005023: Exception handling request to /roscam/index.xhtml: javax.servlet.ServletException
at javax.faces.api@3.0.0.SP04//javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:725)
at javax.faces.api@3.0.0.SP04//javax.faces.webapp.FacesServlet.service(FacesServlet.java:451)
at io.undertow.servlet@2.2.4.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
...
Caused by: java.lang.NullPointerException
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.ManagedPropertyProducer.evaluateExpressionGet(ManagedPropertyProducer.java:87)
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.ManagedPropertyProducer.lambda$new$0(ManagedPropertyProducer.java:60)
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.CdiProducer.create(CdiProducer.java:105)
at com.sun.jsf-impl@2.3.14.SP02//com.sun.faces.cdi.ManagedPropertyProducer.create(ManagedPropertyProducer.java:38)
...
... 57 more
會話Bean
@Named
@SessionScoped
public class SessionBean implements Serializable {
...
@Inject
@ManagedProperty(value = "#{localeBean}")
private LocaleBean localeB;//Error injecting bean NullPointerException
...
@PostConstruct
public void init() {
...
LocaleBean
@Named
@SessionScoped
public class LocaleBean implements Serializable {
@PostConstruct
public void init() {
...
索引.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<f:view locale="#{localeBean.locale}">
hi there
#{sessionBean.doNothing}
</f:view>
</h:body>
</html>
pom.xml
...
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>10.0.0</version>
</dependency>
...
沒有@ManagedProperty 就不能簡單地注入一個LocaleBean 嗎?
運行沒有任何問題
這里
但刪除@ManagedProperty(value = "#{localeBean}")
注釋。
所以
package foo.bar;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@SessionScoped
@Named
public class LocaleBean implements Serializable {
private static final long serialVersionUID = 7584442178216104053L;
private String locale;
public String getLocale() {
return locale;
}
}
package foo.bar;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable {
private static final long serialVersionUID = -6657315612830810889L;
@Inject
private LocaleBean localeB;
private String doNothing = "foobar";
public String getDoNothing() {
return doNothing;
}
}
完美運行。
對於這個測試,你根本不需要 Maven 的東西。
如果出現其他錯誤,請嘗試不使用 Primefaces。
而且應該是
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
如果你得到一個
org.jboss.weld.exceptions.WeldException: WELD-001524: Unable to load proxy class for bean Managed Bean [class LocaleBean] with qualifiers [@Default @Any @Named] with class class LocaleBean
...
java.lang.ClassFormatError: Illegal class name "/LocaleBean$Proxy$_$$_WeldClientProxy" in class file /LocaleBean$Proxy$_$$_WeldClientProxy
錯誤,那么您必須將 bean 類放入 package: Weld 在默認 package 中為 EJB 類創建無效代理。 在 Weld 3.1.7.Final 中修復。 WildFly 22.0.0.Final 包含 Weld 3.1.5.Final,WildFly 23.0.0.Final 包含 Weld 3.1.6.Final...
截至 jakartaee 8 ManagedProperty 已被棄用,正如我們在其api中看到的那樣。
因此,不需要將@ManagedProperty 與@Injecton 一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.