无法在Spring Boot应用程序中加载Application Context

时间:2017-03-29 11:21:08

标签: java spring web-services soap spring-boot

我正在开发一个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的新手,可能已经错过了一些配置。提前谢谢。

1 个答案:

答案 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(推荐): 最好的方法是,您可以使用@AutowiredIValidator对象注入SOAPprocessImpl,如下所示,这样您就不需要SOAPprocessImpl bean了解{{ 1}}。 Spring容器将为ApplicationContextAware类提供的实现注入实例(前提是它位于IValidator的包下)。

@Componentscan