2011-02-18 11 views
7

Mam usługę sieci Web, do której próbuję automatycznie wyposażyć zmienną. Oto klasa:W jaki sposób sprawić, by wiosna @WebService była świadoma?

package com.xetius.isales.pr7.service; 

import java.util.Arrays; 
import java.util.List; 

import javax.jws.WebService; 

import org.springframework.beans.factory.annotation.Autowired; 

import com.xetius.isales.pr7.domain.PR7Product; 
import com.xetius.isales.pr7.domain.PR7Upgrade; 
import com.xetius.isales.pr7.logic.UpgradeControllerInterface; 

@WebService(serviceName="ProductRulesService", 
      portName="ProductRulesPort", 
      endpointInterface="com.xetius.isales.pr7.service.ProductRulesWebService", 
      targetNamespace="http://pr7.isales.xetius.com") 
public class ProductRulesWebService implements ProductRulesWebServiceInterface { 

    @Autowired 
    private UpgradeControllerInterface upgradeController; 

    @Override 
    public List<PR7Product> getProducts() { 
     if (upgradeController == null) { 
      return Arrays.asList(new PR7Product("Fail")); 
     } 
     return upgradeController.getProducts(); 
    } 

    @Override 
    public List<PR7Upgrade> getUpgrades() { 
     if (upgradeController == null) { 
      return Arrays.asList(new PR7Upgrade("Fail")); 
     } 
     return upgradeController.getUpgrades(); 
    } 

    @Override 
    public List<PR7Product> getProductsForUpgradeWithName(String upgradeName) { 
     if (upgradeController == null) { 
      return Arrays.asList(new PR7Product("Fail")); 
     } 
     return getProductsForUpgradeWithName(upgradeName); 
    } 

} 

Jednak przy próbie uzyskania dostępu do usługi internetowej otrzymuję wersja Fail powrócił, co oznacza, że ​​upgradeController nie jest autowired. Oto moja ApplicationContext:

<?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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:component-scan base-package="com.xetius.isales.pr7" /> 
    <context:annotation-config /> 

    <bean id="upgradeController" class="com.xetius.isales.pr7.logic.UpgradeController" /> 

</beans> 

Jak zrobić to tak, że klasa @WebService jest wiosna świadomy i autowiring dzieje

Odpowiedz

11

Jeśli chcesz autowiring się stało, ProductRulesWebService musi rozszerzyć SpringBeanAutowiringSupport

Rozszerzenie tej klasy pozwoli UpgradeController być autowired

3

Korzystając stosie jak CXF, który wspiera Spring natively, można w zasadzie zrobić coś takiego to:

<bean id="aService" class="com.xetius.isales.pr7.service.ProductRulesWebService " /> 

<jaxws:endpoint id="aServiceEndpoint" implementor="#aService" address="/aService" /> 
+0

Może to także z Jersey: http://stackoverflow.com/questions/21104567/springjersey-transactional-annotation –

1

zależności od wersji kontenera lub nawet na wiosnę, zwana trzeba będzie łatwe rozwiązanie, aby odsłonić swoją WSDL, zastosowanie:

@PostConstruct 
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);