2

質問は簡単だと思いますが、次のエラーが表示されます。

Caused by: java.lang.NullPointerException
at co.edu.unal.bienestar.dao.UserDao.save(UserDao.java:27)
at co.edu.unal.bienestar.facade.UserFacade.createUser(UserFacade.java:18)
at co.edu.unal.bienestar.mb.UserMB.createUser(UserMB.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 27 more

エンティティクラスのみを持つアプリケーションで新しいユーザーを作成しようとすると:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String username;
    private String password;
    private Role role;

    <here getters and setters>
}

データ アクセス オブジェクト:

public class UserDao {

    @PersistenceContext
    private EntityManager em;


    public void save(User user) {
        em.persist(user);
    }

    public void delete(User user) {
        User userToBeRemoved = em.merge(user);
        em.remove(userToBeRemoved);
    }

    public User update(User user) {
        return em.merge(user);
    }

    public List<User> findAll() {
        TypedQuery<User> query = em.createQuery(
                "SELECT u FROM User u ORDER BY u.id", User.class);
        return query.getResultList();
    }
}

ファサード:

public class UserFacade {

    private UserDao userDao = new UserDao();

    public void createUser(User user) {
        userDao.save(user);
    }

    public List<User> listAll() {
        List<User> result = userDao.findAll();
        return result;
    }
}

ユーザー管理 Bean:

@SessionScoped
@ManagedBean(name = "userMB")
public class UserMB implements Serializable {
    public static final String INJECTION_NAME = "#{userMB}";
    private static final long serialVersionUID = 1L;
    private User user;
    private UserFacade userfacade;


    public User getUser() {
        if (user == null) {
            user = new User();
        }
        return user;
    }

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

    public void createUser() {
        getUserfacade().createUser(user);
    }

    public UserFacade getUserfacade() {
        if (userfacade == null){
            userfacade = new UserFacade();
        }
        return userfacade;
    }
}

最後に、JSF ページから次のようにメソッドを呼び出します。

    <f:view>
        <h:form>
            <h1><h:outputText value="Create/Edit"/></h1>
            <h:panelGrid columns="2">
                <h:outputLabel value="Username:"/>
                <h:inputText id="username" value="#{userMB.user.username}" title="username" />
                <h:outputLabel value="Password:" />
                <h:inputText id="password" value="#{userMB.user.password}" title="password" />
                   <h:outputLabel value="ID:" />
                   <h:inputText id="id" value="#{userMB.user.id}" title="id" />                                      
            </h:panelGrid>
            <h:commandButton action="#{userMB.createUser}" value="create"/>
        </h:form>
    </f:view>

私の間違いはどこですか?

4

2 に答える 2

2

@PersistenceContextマネージド クラスでのみ機能します。あなたのUserDAO(and UserFacade) は完全に管理されておらず、手動で作成されているようです。この方法では、EntityManagerまったく注入されません。これも手動で作成する必要があります。現在は でありnull、これにより が説明されますNullPointerException

UserDAO(およびUserFacade) をEJBに@Statelessする

@Stateless
public class UserDAO {
    // ...
}

それらを注入するために使用@EJBします(ゲッターの遅延読み込みを削除します)

@EJB
private UserFacade userFacade; // Also on userDAO.

または、環境が EJB (Tomcat など) をサポートしていない場合は、TomEE にアップグレードするか、その上に OpenEJB をインストールするか、サービス ファサードと DAO を管理する代替フレームワークを探す必要があります。Spring はよく使用されますが、Java EE 6 がすでに EJB3 の優れた機能を提供しているのに、Spring を選択する理由は何ですか?

于 2012-11-06T01:29:44.950 に答える