2013-11-09 3 views
1

Я разрабатываю решение Java EE 6, а также пытаюсь выяснить основную причину того, почему инъекция зависимостей не работает ... NullPointerException внутри моей службы (userDao линия):JAX-RS + JBoss 7.1.1 + RESTEasy: NullPointException с использованием CDI

REST Service

@Path("rest") 
public class UserRESTService { 

    @EJB 
    UserDAO userDao; 

    @GET 
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    @Path("{type}") 
    public String getJqGridData(@PathParam("type") String type) { 

     System.out.println("type: " + type); 

     List<USUARIO> usuarios = userDao.findAll(); 
     int pageSize = 10; 
     int pageNumber = ((int) usuarios.size()/pageSize)+1; 

     JqGridData<USUARIO> data = new JqGridData<USUARIO>(pageNumber, 1, usuarios.size(), usuarios); 

     System.out.println("Grid Data: " + data.getJsonString()); 
     return data.getJsonString(); 
    } 

} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    <display-name>MyWeb</display-name> 
    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 
    <context-param> 
      <param-name>javax.faces.application.CONFIG_FILES</param-name> 
      <param-value>/WEB-INF/faces-config.xml</param-value> 
    </context-param> 

     <context-param> 
      <param-name>com.sun.faces.writeStateAtFormEnd</param-name> 
      <param-value>false</param-value> 
    </context-param> 

    <listener> 
       <listener-class> 
         org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 
       </listener-class> 
      </listener> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>Resteasy</servlet-name> 
     <servlet-class> 
      org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher 
     </servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>bch.com.br.service.rest.RESTEasySingleton</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

     <servlet-mapping> 
      <servlet-name>Resteasy</servlet-name> 
      <url-pattern>/rest/*</url-pattern> 
     </servlet-mapping> 

</web-app> 

ОСТАЛЬНЫЕ Singleton

public class RESTEasySingleton extends Application 
    { 
    private Set<Object> singletons = new HashSet(); 
    private Set<Class<?>> empty = new HashSet(); 

    public RESTEasySingleton() { 
     this.singletons.add(new UserRESTService()); 
    } 

    public Set<Class<?>> getClasses() 
    { 
     return this.empty; 
    } 

    public Set<Object> getSingletons() 
    { 
     return this.singletons; 
    } 
} 

DAO

@Stateless 
public class UserDAO extends BaseDAO<USUARIO>{ 

    @PersistenceContext(unitName="MyJPA") 
    private EntityManager em; 

    public UserDAO(Class<USUARIO> entityClass) { 
      super(entityClass); 
    } 

    public UserDAO() { 
     super(USUARIO.class); 
    } 

    @SuppressWarnings("unchecked") 
    public List<USUARIO> findAll() { 

      Query q = getEntityManager().createQuery("SELECT e FROM " + USUARIO.class.getName() + " e"); 
      List<USUARIO> list = (List<USUARIO>) q.getResultList(); 
      return list; 
    } 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

} 

Хотя, инъекции прекрасно работает внутри другого управляемого компонента ...

@ManagedBean 
@RequestScoped 
    @Named 
    public class UserBean { 

    public UserBean() { 
     // TODO Auto-generated constructor stub 
    } 

    private List<USUARIO> users = new ArrayList<USUARIO>(); 
    private String name; 


    @Transient 
    @EJB 
    UserDAO userDao; 

    ... 

} 

Любые идеи?

ответ

1

Добавить @RequestScoped в конечную точку отдыха. Я также удалю ссылку на бутстрап resteasy в вашем web.xml, так как вы развертываете его в контейнере EE6, он не нужен (расширения приложения достаточно).

Смежные вопросы