Simple Spring Java @ Конфигурация для @Autowire без @Bean - PullRequest
0 голосов
/ 30 мая 2019

Я хочу использовать spring @Autowired в проекте отдыха Java. В последние дни я пытаюсь настроить простой весенний проект Java с конфигурацией Java без явной конфигурации bean-компонента, чтобы проверить эту функциональность. Но я не могу заставить его работать. Я могу упустить что-то фундаментальное.

Ни один из подходов, которые я нашел в Интернете и на этом сайте, до сих пор не решил мою проблему. Я не мог найти образец именно для того, чего я пытаюсь достичь тоже. В основном это связано с количеством различных версий пружин и подходов, распространяемых по сети.

Вот так просто, как я мог придумать пример отдыха Java Spring. Я добавил несколько комментариев о том, как я интерпретирую весенние аннотации, поскольку я могу ошибаться и здесь:

Базовый класс приложения

package restoverflow;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class App extends Application {

}

Конфиг класс

package restoverflow;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration  //this is a configuration class and also found by spring scan
@ComponentScan  //this package and its subpackages are being checked for components and its subtypes
public class AppConfig {

}

Немного Пойо

package restoverflow;

public class Pojo {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Услуга

package restoverflow;

import org.springframework.stereotype.Service;

@Service //this is a subtype of component and found by the componentscan
public class PojoService {
    public Pojo getPojo(){
        Pojo pojo = new Pojo();
        pojo.setName("pojoName");
        return pojo;
    }
}

И, наконец, ресурс, где нужно выполнить автоматическое подключение службы

package restoverflow;

import javax.ws.rs.GET;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/resource")
@Controller //this is a subtype of component and found by the componentscan
public class Resource {

    @Autowired //this tells to automatically instantiate PojoService with a default contructor instance of PojoService
    private PojoService pojoService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Pojo getPojo() {
        return pojoService.getPojo();
    }
}

Pom:

...
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.1.7.RELEASE</version>
</dependency>
...

Я хочу, чтобы сервис pojo был создан. Но я получаю исключение NullPointerException.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

A nullpointer вместо NoSuchBeanDefinitionException является скорее индикатором того, что контекст Spring вообще не загружается, а загружается неправильно.

Если вы используете загрузку Spring, измените свой основной класс для инициализации Spring:

@SpringBootApplication
@ApplicationPath("/")
public class App extends Application {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Или (как во фрагменте pom.xml не упоминается загрузка Spring) инициализируйте Spring вручнуюинициализируя ClassPathXmlApplicationContext и добавляя <context:component-scan base-package="restoverflow" /> в свой applicationContext.xml.

0 голосов
/ 30 мая 2019

Похоже, вы используете инъекцию на уровне поля.

Пожалуйста, пройдите по ссылке ниже, чтобы понять все типы инъекций: https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/

Не вижу четкой причины, почему pojoService обнуляется.Пожалуйста, проверьте, правильно ли инициализируется компонент pojoService.Это может быть связано с тем, что bean-компонент pojoService не был инициализирован, и в контроллере вы получаете значение null.

...