@ManagedProperty does not work in a CDI managed bean

▼魔方 西西 提交于 2019-12-30 10:34:47

问题


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



}

回答1:


@ManagedProperty is managed bean annotaion, that can't be used with CDI. In above code, you used CDI bean i.e. @Named that is default in JSF 2.2. In this case you can't use ManagedProperty. Please read following line copied from Java EE docs of ManagedBean.

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

For details see the link:

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

So, use @Inject instead of @ManagedProperty for CDI bean.

@Inject
private User user;

Note that a getter/setter is unnecessary here.



来源:https://stackoverflow.com/questions/17390792/managedproperty-does-not-work-in-a-cdi-managed-bean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!