【问题标题】:JAX-RS and JPA : separate layerswJAX-RS 和 JPA :单独的层
【发布时间】:2014-01-20 10:58:51
【问题描述】:

我正在尝试构建一个具有 JAX-RS 和 JPA 持久性的应用程序;目前,我可以直接从资源类中持久化对象,但我想在 REST 和数据库之间使用另一层。

我想做的是将EntityManager注入我的UserService,然后从资源中调用我的UserService..

这是我所做的,但我总是在 userService 属性上有一个 NullPointerException ......有什么想法吗?

用户资源

@Path( "/user" )
@Produces( MediaType.APPLICATION_JSON )
public class UserResource {

    @EJB
    private UserService userService;

    @GET
    public User findAll() {
        // TEST
        User user = userService.create( "testLogin", "testPassword", "user" );

        return user;
    }

}

用户服务

public class UserService {

    @Inject
    private EntityManager em;

    /**
     * Create a new user
     * 
     * @param user New user or null if error
     */
    public User create( String login, String password, String type ) {
        User user = null;

        try {
            AuthenticationService authService = new AuthenticationService();
            byte[] salt = authService.generateSalt();
            byte[] encryptedPassword = authService.getEncryptedPassword( password, salt );

            user = new User();
            user.setLogin( login );
            user.setSalt( salt );
            user.setPassword( encryptedPassword );
            user.setType( type );

            em.persist( user );
        } catch( NoSuchAlgorithmException e ) {
            System.out.println( "Error during encryption" );
            e.printStackTrace();
        } catch( DAOException e ) {
            System.out.println( "Error accessing database" );
            e.printStackTrace();
        } catch( Exception e ) {
            e.printStackTrace();
        }

        return user;
    }

}

资源

public class Resources {

    @Produces
    @PersistenceContext( unitName="configurator_db" )
    private EntityManager em;

}

【问题讨论】:

    标签: java jpa ejb jax-rs


    【解决方案1】:

    @EJB 注释在 Jax-RS 规范中无效:它可能用于 EJB 层。这就是为什么在 userService 中没有注入任何内容的原因。如果你想获得一个UserService 实例,你必须:

    1. 要么使用java:global[/<app-name>]/<module-name>/<bean-name> 形式的JNDI 查找
    2. 使用 @Stateless 注释您的 Rest 资源,如 here 所述(示例 2)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2023-04-09
      • 2011-06-29
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多