How to make an @WebService spring aware

15,519

Solution 1

If you want autowiring to happen, ProductRulesWebService needs to extend SpringBeanAutowiringSupport

Extending that class will allow UpgradeController to be autowired

Solution 2

Use a stack like CXF, which supports Spring natively, then you can essentially do something like this:

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

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

Solution 3

Depending on container version or even the Spring, hereinafter you will have an easy solution to expose your WSDL, use:

@PostConstruct
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Share:
15,519
Reinout van Rees
Author by

Reinout van Rees

Geek, pure and simple.

Updated on June 25, 2022

Comments

  • Reinout van Rees
    Reinout van Rees almost 2 years

    I have a Web Service which I am trying to Autowire a variable into. Here is the class:

    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);
        }
    
    }
    

    However, when I try to access the web service I am getting the Fail version returned, meaning that upgradeController is not being autowired. Here is my 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>
    

    How do I make it so that the @WebService class is spring aware and autowiring happens

  • Constantino Cronemberger
    Constantino Cronemberger over 9 years
    This can also be done with Jersey: stackoverflow.com/questions/21104567/…