gpt4 book ai didi

jsf - @ManagedProperty 在 CDI 托管 bean 中不起作用

转载 作者:行者123 更新时间:2023-12-01 10:00:06 25 4
gpt4 key购买 nike

我尝试学习 JSF 并遇到与 ManagedProperty 相关的问题。但是我尝试使用它,它总是失败 - 异常指针为空。我做错了什么?
我在stackoverflow上阅读了一些“类似的帖子”,但它们对我没有帮助。 (我使用 GlassFish 4.0、JSF 2.2、JDK 1.7、Netbeans 7.3.1(Java EE 包)和 Java EE 6.0)

<?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">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<br/>
User: #{books.user.name}<br/>
1: #{param.pageId}<br/>
2: #{books.pageId}<br/>
<h:form>
<h:inputText value="#{user.name}" /><br/>
<h:inputText value="#{books.v1}" /><br/>
<h:inputText value="#{books.v2}" /><br/>
<h:inputText value="#{books.result}" /><br/>
<h:commandButton value="dodaj" action="#{books.add}" />
</h:form>
</h:body>
</html>


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tpsa.books.managed;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedProperty;

/**
*
* @author tomasz
*/
@Named(value = "books")
@RequestScoped
public class Books {

private int v1;
private int v2;
private int result;
@ManagedProperty(value = "#{user}")
private User user;

@ManagedProperty(value="#{param.pageId}")
private int pageId;

/**
* Creates a new instance of Books
*/
public Books() {
}

public void add() {
result = v1 + v2;

}

public int getV1() {
return v1;
}

public void setV1(int v1) {
this.v1 = v1;
}

public int getV2() {
return v2;
}

public void setV2(int v2) {
this.v2 = v2;
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}

public User getUser() {
if (user == null) {
System.err.println("WTF");
}
return user;
}

public void setUser(User user) {
this.user = user;
}

public int getPageId() {
return pageId;
}

public void setPageId(int pageId) {
this.pageId = pageId;
}



}

用户
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tpsa.books.managed;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;

/**
*
* @author tomasz
*/
@Named(value = "user")
@SessionScoped
public class User implements Serializable {

private String name;

/**
* Creates a new instance of User
*/
public User() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}



}

最佳答案

@ManagedProperty是托管 bean 注释,不能与 CDI 一起使用。在上面的代码中,您使用了 CDI bean,即 @Named这是 JSF 2.2 中的默认设置。在这种情况下,您不能使用 ManagedProperty。请阅读从 ManagedBean 的 Java EE 文档中复制的以下行。

If this annotation is present on a class that does not have the ManagedBean annotation, the implementation must take no action on this annotation.



详情见链接:

http://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedProperty.html

所以,使用 @Inject而不是 @ManagedProperty对于 CDI bean 。
@Inject
private User user;

请注意,此处不需要 getter/setter。

关于jsf - @ManagedProperty 在 CDI 托管 bean 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com