我正在开发一个Spring Boot应用程序,其中我正在使用该应用程序来公开SOAP Web服务。我在Spring启动应用程序中使用Apache CFX框架进行SOAP impl。我正在使用基于注释的方法。
我在其中一个Beans中从Spring Boot Configuration文件设置Application Context时遇到了问题。以下是我的代码。
@SpringBootApplication
@ComponentScan("com.test")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置文件如下。
@Configuration
public class WebServiceConfiguration {
//All individual bean definitions should go here
@Autowired
ApplicationContext appContext;
@Bean
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/soap-api/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean(name="IValidator")
public IValidator getValidator(){
return new Validator();
}
@Bean(name="SOAPprocessImpl")
public IPSoap getService() {
return new SOAPprocessImpl();
}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), getService());
endpoint.publish("/WS_1.0");
endpoint.setWsdlLocation("process.wsdl");
return endpoint;
}
现在我有了bean SOAPprocessImpl实现,我需要在其中获取Application Context,以便我可以处理Validator bean。我在配置文件中将SOAPprocessImpl声明为bean。代码如下
@javax.jws.WebService (endpointInterface="com.test.IPSoap")
public class SOAPprocessImpl implements IPSoap, ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ac)
throws BeansException {
context = ac;
}
private static final Logger logger = Logger.getLogger(SOAPprocessImpl.class.getName());
private IValidator validator = (IValidator) context.getBean("IValidator"); // context is NULL here
public IRResponse GetBalance(TSSearchParams SearchParams) {
// Some processing logic
}
}
所以问题在于,当我通过部署到嵌入式Tomcat来运行引导应用程序时,即使在实现ApplicationContextAware之后,也没有在SOAPprocessImpl类中设置应用程序上下文。我也尝试过自动装配,但这也没有用。
奇怪的是,我试着看看我是否可以在配置文件中获取ApplicationContext,其中定义了所有bean。这里正在设置正确。
任何人都可以帮我解决这个问题。我是Spring Boot的新手,可能已经错过了一些配置。提前谢谢。
答案 0 :(得分:2)
选项(1):要解决此问题,您需要使用@Configuration
将您的SOAPprocessImpl
bean注册到Spring容器,如下所示,可以注入ApplicationContext
个对象:
@Configuration
@javax.jws.WebService (endpointInterface="com.test.IPSoap")
public class SOAPprocessImpl implements IPSoap, ApplicationContextAware {
private static ApplicationContext context;
private IValidator validator;
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ac)
throws BeansException {
SOAPprocessImpl.context = ac;
}
@PostConstruct//use PostConstruct
public void init() {
validator = (IValidator) context.getBean("IValidator");
}
//add your current code
}
重要的一点是,在容器准备bean之前,不能使用context
对象,因此需要使用上面显示的@PostConstruct
方法初始化变量。
选项2(推荐):
最好的方法是,您可以使用@Autowired
将IValidator
对象注入SOAPprocessImpl
,如下所示,这样您就不需要SOAPprocessImpl
bean了解{{ 1}}。 Spring容器将为ApplicationContextAware
类提供的实现注入实例(前提是它位于IValidator
的包下)。
@Componentscan