4

I try to learn JSF and encountered on a problem connected with ManagedProperty. However I have tried to use it, it always failed - null exception pointer. What am I doing wrongly? I have read some "similar posts" on stackoverflow, but they did not helped to me. (I use GlassFish 4.0, JSF 2.2, JDK 1.7, Netbeans 7.3.1 (Java EE pack) and 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>

Book

/*
 * 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;
    }



}

User

/*
 * 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;
    }



}
4

1 回答 1

9

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

如果这个注解出现在一个没有 ManagedBean 注解的类上,那么实现必须对这个注解不采取任何行动。

详情见链接:

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

因此,使用@Inject而不是@ManagedProperty用于 CDI bean。

@Inject
private User user;

请注意,这里不需要 getter/setter。

于 2013-06-30T13:42:30.350 回答