2015-07-07 4 views
-1

Я действительно запутался в @Inject в Java. Я читал о CDI в учебнике Java EE, и я до сих пор его не понимаю. Не могли бы вы взглянуть на мой код и рассказать мне, что я делаю неправильно?Confused about @Inject

package model.businessLayer; 
import java.util.List; 
import javax.inject.Named; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import model.domainLayer.RADplusUserSupplemental; 

@Named(value = "staffLocal") 
public class StaffCaseloadMgr implements StaffCaseloadMgrLocal { 

    @PersistenceContext(unitName = "CareTeamPersist") 
    EntityManager em; 

    public StaffCaseloadMgr() {} 

    /** 
    * Returns the list of user supplemental records from the database, 
    * based on the patid passed in to staff caseload. 
    * @param patid The patient, or consumer ID 
    * @return List of RADplusUserSupplemental records 
    */ 
    public List<RADplusUserSupplemental> getListForEmails(String patid) { 
     return em.createNamedQuery("StaffCaseload.findEmails", 
      RADplusUserSupplemental.class) 
      .getResultList(); 
    } 
} 

Я разместил там конструктор, думая, что это может помочь. Я не уверен, почему это было бы, однако, потому, что это конструктор по умолчанию. Хорошо, потом.

package utils; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Inject; 
import model.businessLayer.StaffCaseloadMgr; 
import model.domainLayer.RADplusUserSupplemental; 

@SessionScoped 
public class CareTeam implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    static StaffCaseloadMgr staffLocal; 

    /** 
    * This is a static method that retrieves the care team given a particular 
    * consumer ID. 
    * 
    * @param consumerID 
    *   The consumer ID for which to get the care team 
    * 
    * @return A list of emails for the care team 
    */ 
    public static List<Map<String, String>> getCareTeamEmails(String consumerID) { 

     List<Map<String, String>> arrayList = new ArrayList<Map<String, String>>(); 
     for (RADplusUserSupplemental userSupp : staffLocal 
       .getListForEmails(consumerID)) { 
      Map<String, String> emailMap = new HashMap<String, String>(); 
      emailMap.put("staffEmail", userSupp.getOrganizationEmailAddress()); 
      arrayList.add(emailMap); 
     } 
     return arrayList; 
    } 

} 

Я использую Maven, поэтому я ставлю пустой beans.xml в resources/META-INF. Я очень смущен, почему он не работает. Вы можете помочь?

Я должен был знать, что вы не можете прочитать мой разум! Извини за это. Я использую контейнер JBoss, а у моего application.xml есть версия 7. Я хочу поместить JPA в отдельный файл .jar, потому что эта небольшая функция будет использоваться несколькими различными процессами.

Трассировка стека выглядит следующим образом:

07:58:00,811 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/TestConfiguration-1.0].[rest]] (http-/172.29.8.11:443-1) JBWEB000236: Servlet.service() for servlet rest threw exception: java.lang.NullPointerException 
    at utils.CareTeam.getCareTeamEmails(CareTeam.java:43) [CareTeam-1.0.0.jar:] 
    at controller.TestConfiguration.testing(TestConfiguration.java:33) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_79] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_79] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_79] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_79] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.2.1.Final-redhat-10.jar:7.2.1.Final-redhat-10] 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.2.1.Final-redhat-10.jar:7.2.1.Final-redhat-10] 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.2.1.Final-redhat-10.jar:7.2.1.Final-redhat-10] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79] 

EDIT 2: Поэтому я принял совет Svetlin и избавившись от «статический» перед переменной. У меня назвать еще один класс, который имеет @Inject в нем, например, так:

CareTeam.java

package utils; 

import java.io.Serializable; 
import java.util.List; 
import java.util.Map; 

public class CareTeam implements Serializable { 

    private static final long serialVersionUID = 1L; 

    /** 
    * This is a static method that retrieves the care team given a particular 
    * consumer ID. 
    * 
    * @param consumerID 
    *   The consumer ID for which to get the care team 
    * 
    * @return A list of emails for the care team 
    */ 
    public static List<Map<String, String>> getCareTeamEmails(String consumerID) { 
     CareTeamImpl careTeam = new CareTeamImpl(); 
     return careTeam.getCareTeamEmails(consumerID); 
    } 

} 

CareTeamImpl.java

package utils; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.enterprise.context.SessionScoped; 
import javax.inject.Inject; 

import model.businessLayer.StaffCaseloadMgr; 
import model.domainLayer.RADplusUserSupplemental; 

@SessionScoped 
public class CareTeamImpl implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    StaffCaseloadMgr staffLocal; 

    /** 
    * This is a static method that retrieves the care team given a particular 
    * consumer ID. 
    * 
    * @param consumerID 
    *   The consumer ID for which to get the care team 
    * 
    * @return A list of emails for the care team 
    */ 
    public List<Map<String, String>> getCareTeamEmails(String consumerID) { 

     List<Map<String, String>> arrayList = new ArrayList<Map<String, String>>(); 
     for (RADplusUserSupplemental userSupp : staffLocal 
      .getListForEmails(consumerID)) { 
      Map<String, String> emailMap = new HashMap<String, String>(); 
      emailMap.put("staffEmail", userSupp.getOrganizationEmailAddress()); 
      arrayList.add(emailMap); 
     } 
     return arrayList; 
    } 

} 

Он по-прежнему не работает. Это провал на развертывание, с этим:

11:49:45,624 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-18) MSC000001: Failed to start service jboss.deployment.unit."TestConfiguration-1.0.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."TestConfiguration-1.0.war".WeldStartService: Failed to start service 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_79] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_79] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79] 
Caused by: org.jboss.weld.exceptions.UnserializableDependencyException: WELD-001413 The bean Managed Bean [class utils.CareTeamImpl] with qualifiers [@Any @Default] declares passivating scope but has non-serializable dependency Managed Bean [class model.businessLayer.StaffCaseloadMgr] with qualifiers [@Any @Default @Named] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPointPassivationCapable(Validator.java:360) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:331) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:143) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:163) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:382) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:379) 
    at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:64) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] 
    ... 3 more 

Я не делал «реализует Serializable» вещь в CareTeam.java - я смотрел на вещи в RedHat Портал клиента, который рекомендовал на этот тип ошибки, чтобы сделать это Serializable - поэтому я положил это туда и получил тот же результат. Теперь я не знаю, что думать.

+0

Мы спутать больше, чем вы; по крайней мере, вы знаете, что не работает, мы не делаем (вы держите это как секрет по какой-то причине). –

+1

Извините, что я должен был знать, что вы не могли прочитать мой разум! ;-) – horndinkle

ответ