gpt4 book ai didi

java - 无法在 Spring Boot 应用程序中加载应用程序上下文

转载 作者:行者123 更新时间:2023-11-30 02:35:52 29 4
gpt4 key购买 nike

我正在开发一个 Spring Boot 应用程序,其中我使用该应用程序来公开 SOAP Web 服务。我在 Spring boot 应用程序中使用 Apache CFX 框架进行 SOAP impl。我正在使用基于注释的方法。

我在从其中一个 Bean 中的 Spring Boot 配置文件设置应用程序上下文时遇到问题。下面是我的代码。

@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 实现,我需要在其中获取应用程序上下文,以便可以获取 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 类中设置。我也尝试过 Autowiring ,但这也不起作用。

奇怪的是,我试图查看是否可以在定义所有 bean 的配置文件中获取 ApplicationContext。这里它正在正确设置。

谁能帮我解决这个问题。我是 Spring Boot 的新手,可能错过了一些配置。提前致谢。

最佳答案

选项(1):要解决此问题,您需要使用@Configuration将您的SOAPprocessImpl bean注册到Spring容器如下所示,以便可以注入(inject)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 对象注入(inject)到 SOAPprocessImpl 中,如下所示,这样您就不需要 >SOAPprocessImpl bean 要了解 ApplicationContextAware。 Spring 容器将为 IValidator 类提供的实现注入(inject)实例(前提是它位于 @Componentscan 包下)。

@Component
@javax.jws.WebService (endpointInterface="com.test.IPSoap")
public class SOAPprocessImpl implements IPSoap {

private static final Logger logger = Logger.getLogger(SOAPprocessImpl.class.getName());


@Autowired //spring directly injects this object
private IValidator validator;

public IRResponse GetBalance(TSSearchParams SearchParams) {
// Some processing logic
}
}

关于java - 无法在 Spring Boot 应用程序中加载应用程序上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43092081/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com