2015-11-17 6 views
0

Прошло много времени с тех пор, как я работал с Spring, и в первый раз настраивал Spring на веб-службу с нуля, поэтому ... Возможно, я задаю здесь несколько глупых вопросов.Autowiring in Spring WS, вызывающий нулевой указатель

Мое обслуживание и все его бобы построены с использованием CXF. Соответствующие части Implementor выглядеть следующим образом:

... 

@WebService(
      endpointInterface = "mil.army.sddc.ibs.ccr.datamgmt.DataMgmtPortType", 
      name="DataMgmt_Service", 
      portName="DataMgmt_Port", 
      targetNamespace = "http://ccr.ibs.sddc.army.mil/DataMgmt") 
@Service("dataMgmtWebService") 
public class DataMgmtWebServiceImpl implements DataMgmtPortType { 

    @Autowired 
    private RSNCodeDAO rsnCodeDAO; 

    ... 

Это DAO, который выглядит следующим образом

@Repository 
public class RSNCodeDAO { 
... 

находится в applicationContext.xml Thusly:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/context 

    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://cxf.apache.org/jaxws 
    http://cxf.apache.org/schemas/jaxws.xsd"> 

    <context:component-scan base-package="https"/> 
    <context:annotation-config /> 

    <context:component-scan base-package="mil.army.sddc.ibs.ccr.dbwrapper.dao" /> 

    <bean id="impl" class="mil.army.sddc.ibs.ccr.datamgmt.webservice.DataMgmtWebServiceImpl"/> 

    <bean id="reasonCodeDAO" 
    class="mil.army.sddc.ibs.ccr.dbwrapper.dao.RSNCodeDAO" autowire="byName" /> 

    <jaxws:endpoint 
     id="dataMgmtWebService" 
     implementor="#impl" 
     address="/DataMgmt" /> 

И, наконец, я не уверен, что вам это нужно, но вот 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_2_5.xsd" 
id="WebApp_ID" version="2.5"> 

    <display-name>CCRDataMgmt</display-name> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

</web-app> 

Так что если один из вас знает, какую тупую вещь я забываю, я был бы признателен.

Редактировать: трассировка стека была запрошена. У меня пока нет настроек регистрации, поэтому приношу извинения за формат ответа на исключение мыла.

Pastebin

+0

Вы не указали самый важный бит: фактическую трассировку стека исключений. – kryger

+0

Это исключение нулевого указателя, в котором вызывается DAO. Я не могу представить, что вы узнаете от него, но я добавляю его на всякий случай. – user2561604

+0

Почему вы определяете свои beans expicitly (например, '', ''), но * также * включить компонент сканирования и аннотации конфигурации? (т. е. использовать '@ Service',' @ Repository' и т. д.). Не уверен, что это может быть источником ваших проблем, но симптомы согласуются с 'DataMgmtWebServiceImpl', которые не управляются (т. Е. Видимыми) Spring. Вы должны попробовать увеличить внутренний уровень ведения журнала Spring и проверить журнал запуска. – kryger

ответ

-1

Вместо `

<context:component-scan base-package="https"/>` 
<context:component-scan base-package="mil.army.sddc.ibs.ccr.dbwrapper.dao" /> 

`

Попробуйте использовать <context:component-scan base-package="https, mil.army.sddc.ibs.ccr.dbwrapper.dao"/>

Я предполагаю, что DataMgmtWebServiceImpl класс ваш пребывает под "HTTPS" пакета.

+0

Оба подхода эквивалентны. – kryger

+0

Это был пример applicationcontext.xml, который дал мне мой босс. Сначала я предположил, что линия, создающая базовый пакет https, была чем-то необходимым вообще, но я предполагаю, что это всего лишь пакет в проекте, из которого он его вытащил. DataMgmtWebServiceImpl, как указано в его описании компонента, находится в файле mil.army.sddc.ibs.ccr.datamgmt.webservice. – user2561604

0

В моей среде

  • JBoss 6,4
  • ботинок весна 1.4.3.RELEASE
  • Java 8

Продлить SpringBeanAutowiringSupport не работает, или позвоните по телефону SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (это) в @PostConstruct. Jboss вызывает Apache cxf, создавая веб-службу, прежде чем создавать контекст Spring, для решения задачи javax.xml.ws.WebServiceContext с помощью javax.annotation.Resource, той же самой, которая хранит информацию о запросе. Я скопирую код:

@WebService(serviceName = "LibretasBcbWsImplService") 
public class LibretasBcbWsImpl { 
private final Logger log = LoggerFactory.getLogger(LibretasBcbWsImpl.class); 

@Autowired 
private AppProperties appProperties; 

@Resource 
WebServiceContext wsContext; 

public LibretasBcbWsImpl() { 
    log.info("Creando LibretasBcbWsImpl ............."); 
} 

@PostConstruct 
@WebMethod(exclude = true) 
public void init() { 
    log.info("wsContextwsContext es nulo? " + (wsContext == null)); // Returns false when calling from client 
    log.info("appProperties es nulo? " + (appProperties == null)); // true when calling from client 
    if (wsContext != null) { 
     MessageContext mc = wsContext.getMessageContext(); 
     if (mc != null){ 
      ServletContext servletContext = (ServletContext) mc.get(MessageContext.SERVLET_CONTEXT); 
      SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletContext); 
     } 
    } 
    log.info("appProperties es nulo? " + (appProperties == null)); // return false!!!!! 
} 

@WebMethod(operationName = "getLibsByIdLibreta") 
@WebResult(name = "datos") 
public Datos getLibsByIdLibreta(String id_libreta) { 
    ... 
} 
}