web-dev-qa-db-ja.com

Spring Boot Autowired null

Spring Bootプロジェクトにはいくつかのクラスがあり、@ Autowiredで動作するものもあれば、動作しないものもあります。ここに私のコードが続きます:

Application.Java(@Autowiredは動作します):

package com.example.myproject;

@ComponentScan(basePackages = {"com.example.myproject"})
@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = "com.example.myproject.repository")
@PropertySource({"classpath:db.properties", "classpath:soap.properties"})
public class Application {

@Autowired
private Environment environment;

public static void main(String[] args) {
    SpringApplication.run(Application.class);
}

@Bean
public SOAPConfiguration soapConfiguration() {
    SOAPConfiguration SOAPConfiguration = new SOAPConfiguration();
    SOAPConfiguration.setUsername(environment.getProperty("SOAP.username"));
    SOAPConfiguration.setPassword(environment.getProperty("SOAP.password"));
    SOAPConfiguration.setUrl(environment.getProperty("SOAP.root"));
    return SOAPConfiguration;
}

HomeController(@Autowiredは動作します):

package com.example.myproject.controller;

@Controller
class HomeController {

    @Resource
    MyRepository myRepository;

MyService(@Autowiredは機能しません):

package com.example.myproject.service;

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    public SOAPConfiguration soapConfiguration; // is null

    private void init() {
    log = LogFactory.getLog(MyServiceImpl.class);
    log.info("starting init, soapConfiguration: " + soapConfiguration);
    url = soapConfiguration.getUrl(); // booom -> NullPointerException

SOAPConfigurationを取得しませんが、アクセスしようとすると、アプリケーションがnullポインター例外で壊れます。

私はすでにここで多くのスレッドを読んでググったが、まだ解決策を見つけられなかった。私は必要なすべての情報を提供しようとしました。何か足りないものがあれば教えてください。

7
dexBerlin

自動配線が行われる前に、init()を呼び出すと思います。 init()に@PostConstructアノテーションを付けて、すべての春の自動配線後に自動的に呼び出されるようにします。

編集:あなたのコメントを見た後、私はあなたがnew MyServiceImpl()を使用してそれを作成していると思います。これにより、SpringからMyServiceImplの制御が奪われ、ユーザーに提供されます。そのような場合、自動配線は機能しません

10
sinujohn

いずれかの構成クラスでSOAPConfigurationクラスのBeanを作成しましたか?プロジェクトでクラスを自動配線する場合は、そのクラスのBeanを作成する必要があります。例えば、

@Configuration
public class SomeConfiguration{

    @Bean
    public SOAPConfiguration createSOAPConfiguration(){

        return new SOAPConfiguration();
    }

}

public class SomeOtherClass{

    @Autowired
    private SOAPConfiguration soapConfiguration;
}
1
furkan3ayraktar