Spring Boot @Autowired MessageSource在一个类中起作用,而在另一类中不起作用

时间:2019-01-26 09:14:23

标签: java spring-boot

我正在学习用于开发Web应用程序的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)
    [...]
}

spring - component autowired in one class but not in another中,巴拉吉·克里希南(Balaji Krishnan)说:“您没有使用spring来获取Account实例-因此spring没有机会对其进行自动装配”。也许我应该做些类似的事情,但是我不明白怎么做。

有人可以帮我吗?

谢谢你,米哈伊尔。

2 个答案:

答案 0 :(得分:0)

要使Spring利用依赖注入,所有bean必须全部由Spring管理。 AlbumModel对象的创建应在spring之前进行管理,以便MessageSource可以自动连线。如果AlbumModel不应该由spring管理,而您想自己创建对象(我怀疑是因为您用@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的创建在春季之前进行管理时,建议使用构造函数注入。在an article by a Spring contributor

上了解有关此内容的更多信息

答案 1 :(得分:0)

谢谢你们的回答。

Amit Bera,我仅通过调用其构造函数来创建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;
    }
    [...]
}

Nazeem,我向AlbumModel类添加了@Component批注,希望可以注入MessageSource bean。不幸的是,不是。

我可以将MessageSource作为参数传递,即使我不注释构造函数@Autowired,它也可以正常工作。如果我理解正确的话,MessageSource bean被注入到AlbumController中,因为它是由Spring管理的,并且它没有注入到AlbumModel中,因为它不是由Spring管理的。对?如果是这样,我有什么办法让Spring管理AlbumModel对象?