JAX-RS和JPA:单独的layersw

时间:2014-01-20 10:58:51

标签: java jpa ejb jax-rs

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

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

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

UserResource

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

}

UserService

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;

}

1 个答案:

答案 0 :(得分:0)

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

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