当前位置: 首页 > 知识库问答 >
问题:

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

霍财
2023-03-14

我正在处理一个Spring Boot应用程序,其中我使用该应用程序公开SOAP WebService。我在Spring boot应用程序中使用Apache CFX framework for 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实现,我需要在其中获取应用程序上下文,以便能够处理验证器bean。我已经在configuraton文件中将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
    }

}

共有1个答案

黄查猛
2023-03-14

选项(1):要解决该问题,您需要使用@configuration将您的SOAPProcessIMPLbean注册到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中,如下所示,这样您就不需要SOAPProcessIMPLbean知道ApplicationContextAWare。Spring容器将注入为IValidator类提供的实现的实例(前提是它在@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
    }
}
 类似资料:
  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 部署在Heroku上的Rails应用程序无法加载。我设置了数据库迁移,我还有puma和procfile。。。我真的不知道。 这是我的日志: 宝石文件 程序文件 配置/puma.rb 工人整数(ENV['WEB_CONCURRENCY']||2)threads_count=整数(ENV['RAILS_MAX_THREADS']||5)线程threads_count,threads_count pre

  • 在我的项目中,我想使用特定于环境的属性文件。例如,如果我在开发中运行它,它应该使用应用程序。dev.properties,对于生产,它应该使用应用程序。产品属性等等。 我有下面两个文件在我的资源文件夹。 application.properties(用于生产) application.dev.properties(用于开发) 我有一个属性像下面的每个文件。 为了刺激 给德夫 我有一门课,如下所示

  • 我目前正在学习springboot。通过选择spring starter project,我在STS中创建了一个项目。spring boot版本2.2.2和已导入JPA、H2和RestRepository。 下面是我的领域类, 应用属性 存储库类 在波姆。xml显示了下面提到的错误。不确定,因为这一点,我得到了错误,但我没有在pom的任何变化。xml 在运行项目时,我得到了以下错误,不知道为什么整

  • 我已经提供了Linux SWT jar,并在Eclipse中打包了应用程序,以便在应用程序的jar中包含SWT.jar。当我尝试在Ubuntu上运行它时,我得到了以下错误文本(发布只是原因):