【问题标题】:How to persist data in JAX-WS web services in java ee 6 Framework?如何在 java ee 6 框架中的 JAX-WS Web 服务中持久化数据?
【发布时间】:2013-09-27 11:45:36
【问题描述】:

我在 java ee 6 框架中有一个 J2EE 项目。带有 EJB 和 War 模块。 我想在 EJB 模块中添加一个服务来操作数据库中的一些数据,所以我需要访问服务方法中的 DAO 方法。但它返回错误!

@WebService(serviceName = "AddUserService")
@Stateless()
public class AddUserService {
   @PersistenceContext(unitName = "UserRegistrationService-ejbPU")
    EntityManager em;

    @WebMethod(operationName = "registerUser")
    public String registerUser(BasicUserInfo basicUserInfo) {
        UserEJB userEJB=new UserEJB(em);
        String retValue = "";
        User user = new User();
        user.setAge(basicUserInfo.getAge());
        user.setUserName(userName);
        userEJB.addUser(user);
        retValue = " User Registered with user_ID:" + user.getId().toString() + "  and userName:" + user.getUserName();
        return retValue;
    }
}

EJB 类代码是:

    @TransactionManagement(TransactionManagementType.CONTAINER)
@Stateless
public class UserEJB {

    @PersistenceContext(unitName = "UserRegistrationService-ejbPU")
    EntityManager em;

    public UserEJB() {
    }

    public UserEJB(EntityManager em) {
        this.em = em;
    }

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

测试服务在服务器上产生这个错误:

        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
    at dao.UserEJB.addUser(UserEJB.java:34)
    at app.Services.AddUserService.registerUser2(AddUserService.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)

【问题讨论】:

  • 能否把addUser方法的代码放到UserEJB类中。 NPE 来自 UserEJB 的 addUser 方法。
  • 问题是 em 在 userEjb.addUser() 中为 null 我不知道为什么?

标签: java jakarta-ee jax-ws ejb-3.0 java-ee-6


【解决方案1】:

您的 EntityManger 不会被容器注入,因为您自己创建了 UserEJB 对象!你打破了注入链。使用 DI 时,您必须让容器为您创建对象。试试这个方法:

@WebService(serviceName = "AddUserService")
@Stateless()
public class AddUserService {

    //actually you don't need this here, you'll get that injected inside the UserEJB
    @PersistenceContext(unitName = "UserRegistrationService-ejbPU")
    EntityManager em;


    @Inject
    UserEJB userEjb;

    @WebMethod(operationName = "registerUser")
    public String registerUser(BasicUserInfo basicUserInfo) {
        //you don't need this line, the container will instantiate the object for you!
        //UserEJB userEJB=new UserEJB(em);
        String retValue = "";
        User user = new User();
        user.setAge(basicUserInfo.getAge());
        user.setUserName(userName);
        userEJB.addUser(user);
        retValue = " User Registered with user_ID:" + user.getId().toString() + "  and         userName:" + user.getUserName();
        return retValue;
    }
}

【讨论】:

  • 是的,你是对的。但它也没有用。再次出现同样的错误。我不知道如何告诉容器为这个类创建对象。
  • 另一个问题!如何在服务测试中调试服务(设置断点,..)?
【解决方案2】:

错误在第 34 行的 UserEJB.java 类中,因此请发布该代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多