Spring Boot @Autowired MessageSource работает в одном классе и не работает в другом - PullRequest
0 голосов
/ 26 января 2019

Я изучаю загрузочный фреймворк Spring (версия 2.0.7.RELEASE) для разработки веб-приложения.Когда я пытаюсь автоматически связать класс MessageSource, он работает для одного класса, но не для другого:

Вот мой класс WebConfig:

package net.local.mis.phog.config;
@Configuration
public class WebConfig implements WebMvcConfigurer {
    [...]
    @Bean
    public MessageSource messageSource() {
        // This is the only place around application where messageSource is created
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }
    [...]
}

Все отлично работает, например, в классах контроллера:

package net.local.mis.phog.controller;
@Controller
@Transactional
public class AlbumController {
    [...]
    @Autowired
    private MessageSource messageSource; (works fine)
    [...]
}

Но когда я пытаюсь внедрить messagSource в классы модели, происходит сбой:

package net.local.mis.phog.model;
@Component
public class AlbumModel {
    [...]
    @Autowired
    private MessageSource messageSource; (null)
    [...]
}

In spring - компонент автоматически подключается в одном классе, но не в другом Баладжи Кришнан говорит: «Вы не используете пружину для получения экземпляра учетной записи - поэтому у пружины не было возможности автоматически подключить его».Возможно, мне следует сделать что-то подобное, но я не могу понять, как.

Может кто-нибудь, пожалуйста, помогите мне.

Спасибо, Михаил.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Спасибо, ребята, за ваши ответы.

Амит Бера, я создаю объект AlbumModel, просто вызывая его конструктор:

package net.local.mis.phog.controller;

@Controller
@Transactional
public class AlbumController {
    [...]
    @Autowired
    private JenreDao jenreDao;
    @Autowired
    private MessageSource messageSource;

    [...]
    @RequestMapping(value={"/album"},method=RequestMethod.GET)
    public String albumShowHandler(Model model,
                                   HttpServletRequest request,
                                   @RequestParam(value="jenreIdSelected") Long jenreIdSelected,
                                   @CookieValue(value="thumbnailOrder",defaultValue="ordDefault") String thumbnailOrder,
                                   [...]) {
        [...]
        ThumbnailOrderAux thumbnailOrderAux = new ThumbnailOrderAux(thumbnailOrder);
        JenreAux jenreAux = new JenreAux(jenreDao.getLstJenreModel(null,jenreIdSelected),jenreIdSelected);
        AlbumModel albumModel = new AlbumModel(jenreAux,thumbnailOrderAux);
        [...]

        model.addAttribute("albumModel",albumModel);

        return "album";
    }
    [...]
}

А вот код конструкторов AdminModel:

package net.local.mis.phog.model;

@Component
public class AlbumModel {
    private JenreAux jenreAux;
    private ThumbnailAux thumbnailAux;
    [...]

    public AlbumModel() {
        super();
    }
    public AlbumModel(JenreAux jenreAux,ThumbnailOrderAux thumbnailOrderAux) {
        super();

        this.jenreAux = jenreAux;
        this.thumbnailOrderAux = thumbnailOrderAux;
    }
    [...]
}

Назим, я добавил аннотацию @Component к классу AlbumModel в надежде, что bean-компонент MessageSource будет внедрен. К сожалению это не было.

Я мог бы передать MessageSource в качестве аргумента, и он работает, даже если я не аннотирую конструктор @Autowired. Если я правильно понимаю, бин MessageSource внедряется в AlbumController, потому что он управляется Spring, и не вводится в AlbumModel, потому что он не управляется Spring. Правильно? Если да, есть ли способ заставить Spring управлять объектом AlbumModel?

0 голосов
/ 26 января 2019

Чтобы пружина использовала инъекцию зависимостей, все бобы должны управляться пружиной.Spring * должен управлять созданием объекта AlbumModel, чтобы MessageSource мог быть подключен автоматически.Если AlbumModel не должен управляться пружиной, и вы хотите создать объект самостоятельно (в чем я сомневаюсь, потому что вы пометили его с помощью @Component), то вы также можете использовать инжектор конструктора.

В то время как вы можете иметь что-токак это:

package net.local.mis.phog.model;
@Component
public class AlbumModel {
    [...]

    private MessageSource messageSource; 
    [...]

    @Autowired
    public AlbumModel(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
}

С решением выше, когда вы вручную создаете AlbumModel, вы можете передать объект MessageSource, который уже автоматически подключен вызывающим классом (например, контроллером или любой службой).класс слоя).Но также, когда AlbumModel создание управляется весной, рекомендуется использовать конструктор инъекций.Подробнее об этом читайте в статье автора Spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...