我已经在我的服务器项目中使用Jax-ws实现了一个WS,并且我正在从客户端应用程序调用该服务。问题是,如果我想在@WebService注释类中使用@Autowire,它总是会抛出以下错误:
InjectionException:为类创建托管对象时出错:class com.myco.wsserver.LeaveRequestEndPoint;
如果我调试该类,则对我的autowired bean的引用为null。如果我从我的@webservice注释类中删除它,它也可以工作,如果我手动获取应用程序上下文然后获取它也可以工作,但我想知道为什么我不能自动装配任何bean。
这是我的代码。
WebService类:
@WebService(serviceName="LeaveRequestHandler")
public class LeaveRequestEndPoint extends SpringBeanAutowiringSupport{
@Autowired
GenericBean mBean;
public LeaveRequestEndPoint(GenericBean mBean){
this.mBean = mBean;
}
@WebMethod(operationName="executeOperation")
public String getText() {
return mBean.getText();
}
}
应用程序上下文:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<context:annotation-config />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:bean id="genericBean" class="com.myco.wsserver.GenericBean"/>
</beans:beans>
答案 0 :(得分:0)
在注入发生之前调用类构造函数。它不是使用spring构建类的方法。在构造类时,可以使用@PostConstruct
注释保证注入,或者可以使用构造函数注入。
构造函数现在是一个合适的构造函数。在构造函数运行后完成注入。
您有2个选项。
将@Autowired注释移动到构造函数。 (构造函数注入)
@Autowired public LeaveRequestEndPoint(GenericBean mBean)
删除构造函数并使用setter getter注入。 (setter getter injection)
GenericBean mBean;
具有默认访问修饰符,这就是您的注入失败的原因。将mBean
更改为私有,并添加setter getters。
@Autowired
private GenericBean mBean;
public setMBean(GenericBean mBean)
{
this.mBean = mBean;
}
public getMBean()
{
return this.mbean;
}