Проблема с пружинным автоматическим объявлением - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь создать приложение, следуя примеру кода в книге «Весенние данные» Петри Кайнулайнена. У меня есть служба RepositoryContactService пакет com.packtpub.springdata.jpa.service;

@Service("service")
public class RepositoryContactService implements ContactService {

Мой класс ApplicationContext устанавливает пакет службы для сканирования

@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {

Я выполняю тест класса с объявлением

@Autowired
private static RepositoryContactService service;

и код в основном методе

Contact contact = new Contact("handro1104@gmail.com", "handro");
service.save(contact);

Проблема в том, что строка "service.save (contact);" дает мне услугу ноль.

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Может быть много причин, по которым Spring не может автоматически подключить RepositoryContactService.

  1. RepositoryContactService отсутствует в пакетах, объявленных в @ComponentScan. Для этого попробуйте добавить пакеты, в которых RepositoryContactService и ContactService присутствует в списке в @ ComponentScan.
  2. Вы написали, что написали класс Test. Если это класс модульного тестирования, проверьте наличие всех аннотаций, используемых для модульного тестирования.

Хотя это не решит нулевую проблему, но я предпочитаю программирование для интерфейса и использование Qualifier, чтобы сообщить контейнеру Spring, какую реализацию интерфейса вводить.

0 голосов
/ 03 сентября 2018

Спасибо всем, кто откликнулся. Я обнаружил, что вы не можете автоматически связать статическое поле, и попытался

@Component
public class Test {
    @Autowired
    private ContactService service;

    public static void main(String[] args) {
        Test test = new Test();
        Contact contact = new Contact("handro1104@gmail.com", "handro");
        ContactService service = test.service;
        service.save(contact);
    }

Но это тоже не сработало. Я тоже пробовал

public class Test {
    public static void main(String[] args) {
        ContactService service = new RepositoryContactService();
        Contact contact = new Contact("handro1104@gmail.com", "handro");
        service.save(contact);
    }

С

    @Resource // Also tried with @Autowired
    private ContactRepository repository;
@Configurable
public class RepositoryContactService implements ContactService {
    @Override
    public void save(Contact updated) {
        repository.save(updated);
    }

Но хранилище здесь было пустым.

Для большей ясности, у меня есть

@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {

Так что RepositoryContactService сканируется и ContactRepository в com.packtpub.springdata.jpa.repository может быть подключен автоматически. В какой-то момент я даже добавил com.packtpub.springdata.jpa.repository в @ ComponentScan.

0 голосов
/ 02 сентября 2018

Из класса, который аннотирован @Service, создается только один bean-компонент, поскольку для @Service по умолчанию используется Singleton, поэтому вам не нужно автоматически связывать эти bean-компоненты статически.

Изменение:

@Autowired
private static RepositoryContactService service;

Кому:

@Autowired
private RepositoryContactService service;
...