2014-08-04 3 views
0

Я разрабатываю веб-сервис spring-ws, в котором вызывается веб-служба банка.Весенние вложенные инъекции

Вот моя весна файл конфигурации:

<bean id="PaymentService" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition" lazy-init="true"> 
    <property name="schemaCollection"> 
     <bean class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection"> 
      <property name="inline" value="true" /> 
      <property name="xsds"> 
       <list> 
        <value>schemas/PaymentServiceOperations.xsd</value> 
       </list> 
      </property> 
     </bean> 
    </property> 
    <property name="portTypeName" value="PaymentService" /> 
    <property name="serviceName" value="PaymentService" /> 
    <property name="locationUri" value="/endpoints" /> 
</bean> 

<bean id="bankWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"> 
    <property name="serviceInterface" value="com.example.stub.PaymentIFBindingSoap" /> 
    <property name="wsdlDocumentUrl" value="https://bank.com/payment.asmx?WSDL" /> 
    <property name="namespaceUri"  value="urn:Foo" /> 
    <property name="serviceName"  value="PaymentIFBinding" /> 
    <property name="portName"   value="PaymentIFBindingSoap" /> 
</bean> 

Первый боб в моей оплаты обслуживания и второй один веб-сервис, клиент потребляя финансовую услугу, предоставляемую моим банком.

Теперь мои сервисные интерфейсы и их реализация:

@Configurable 
public class BankService implements IBankService { 

    @Autowired 
    private PaymentIFBindingSoap webService; 
} 


@Service 
public class PaymentService implements IPaymentService { 

    @Autowired 
    private IBankService bankService; 

} 

И, наконец, моя собственная служба (PaymentService) конечная точка:

@Endpoint 
public class PaymentServiceEndpoint { 

    @Autowired 
    private IPaymentService paymentService; 
} 

Просто, чтобы убедиться, что все ясно, обратите внимание, что моя конечная точка имеет экземпляр «PaymentService» и PaymentService имеет экземпляр «BankService», который сам вводит.

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

org.springframework.beans.factory.BeanCreationException: Ошибка создания боб с именем ' paymentServiceEndpoint ': отказ от автоматической проводной зависимости не удался; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Не удалось создать поле autwire: private com.villaparvaneh.services.IPaymentService com.villaparvaneh.services.endpoints.PaymentServiceEndpoint.paymentService; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «paymentService»: не удалось выполнить инъекцию автоуведомленных зависимостей; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Не удалось автополе: private com.villaparvaneh.services.saman.IBankService com.villaparvaneh.services.PaymentService.samanService; Вложенное исключение - это org.springframework.beans.factory.NoSuchBeanDefinitionException: никакой определяющий компонент типа [com.villaparvaneh.services.saman.IBankService] не найден для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат autwire для этой зависимости. Зависимость от аннотаций: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = истина)}

Моя первая догадка, что это не возможно, чтобы иметь вложенные инъекции, как я делал здесь, но я не мог» t найти что-нибудь, поддерживающее его.

+0

Когда ваш bean-компонент '@ Configurable', Spring не будет автоматически вводить его для вас, вам нужно создать экземпляр вручную, например. 'IBankService bankService = new BankService();' –

+0

* Мое первое предположение заключалось в том, что невозможно иметь вложенные инъекции, как я сделал здесь, но я не мог найти ничего, поддерживающего его *, и вы не найдете такую ​​информацию, потому что Spring поддерживает * вложенные инъекции *. –

+0

@LuiggiMendoza Спасибо за ваш ответ. У меня создалось впечатление, что настраиваемые bean-компоненты также будут автоматически введены. Как сказал Патрик ниже, я получил его, изменив Конфигурируемое на сервис. – mdoust

ответ

0

Почему бы не изменить свою аннотацию на BankService от Configurable to just Service. Настраиваемая аннотация используется для применения инъекции зависимостей к компоненту вне контекста Spring, например, если вы сделали «новый BankService()». У меня был плохой опыт в этой работе. Если вы аннотируете BankService с аннотацией службы, то сканирование компонентов будет создавать экземпляр, а затем ввести его в PaymentService.

+0

Спасибо за ваш отзыв – mdoust

+0

Нет проблем вообще :) –

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