0

框架:Spring 3。

我真的不明白为什么 bean 中的消息源注入端总是为 NULL。

这是片段:

servlet.xml

<context:annotation-config />

<context:component-scan base-package="com.myproject.controllers" />

<mvc:annotation-driven />


<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/messages/messages" />
    <property name="cacheSeconds" value="0" />
</bean>

messageSource 注入的类

import com.myproject.controllers.forms.RegistrationForm;

@Component
public class RegistrationFormValidator implements Validator {

@Autowired
@Qualifier("messageSource")
private MessageSource messageSource;


    //other stuff here...

}

这是控制器

@Controller
@SessionAttributes("userSearchForm")
public class UsersController extends PaginationController<ProfiledUser>{


@InitBinder(value="registrationForm")
public void initBinder(WebDataBinder binder)
{
    binder.setValidator(new RegistrationFormValidator());
}

我已经尝试过以下方法:

  1. 删除注解并通过xml配置文件注入消息源
  2. 实现 MessageSourceAware 接口
  3. 试图注入一个ReloadableresourceBundleMessageSource而不是使用接口MessageSource

一切都以史诗般的失败告终;-) 如何正确注入 MessageSource?

4

4 回答 4

1

我认为您正在检查 CGLIB 类的字段值

请参阅spring 单例 bean 字段未填充 更新

关于自动装配的一般说明

@AutowiredAutowiredAnnotationBeanPostProcessor可以通过在相应的spring配置文件中指定注释来处理<context:annotation-config />注释(bean后处理器在每个容器的基础上工作,因此您需要为servlet和应用程序根上下文设置不同的后处理器=>您需要将<context:annotation-config />两者都放入Web 应用程序上下文和调度程序 servlet 配置)。

请注意,@Autowired注解具有required默认设置为 true 的属性,这意味着如果发生自动装配过程,Spring 将检查指定 bean 的一个实例是否存在。如果注解字段的 bean@Autowired是单例,则检查将在应用程序初始化期间执行。

更新在这个特定的问题中,Validator实例根本不是由 Spring 创建的,这就是为什么没有执行自动装配并且没有引发初始化异常的原因。

于 2012-11-24T15:58:14.157 回答
0

将 basename 更改为如下所示:

<property name="basename" value="classpath:messages/messages" />
于 2014-03-06T15:03:49.797 回答
0

当我尝试在自定义日期格式化程序中使用 MessageSource 时,我遇到了类似的问题。

代码 AppDateFormatter

public class AppDateFormatter implements Formatter<Date> {

    @Autowired
    private MessageSource messageSource;

    other stuff.....

    private SimpleDateFormat createDateFormat(final Locale locale) {
        final String format = this.messageSource.getMessage("date.format", null, locale);
        final SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        dateFormat.setLenient(false);
       return dateFormat;
   }

}

这对我有用:

public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

  other stuff.....

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasenames("Messages/Messages", "Messages/Labels");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(1);
        return messageSource;
    }    

    @Bean
    public AppDateFormatter appDateFormatter(){
        return new AppDateFormatter();
    }

    @Bean
    public FormattingConversionService mvcConversionService() {
        FormattingConversionService conversionService = new DefaultFormattingConversionService();
        conversionService.addFormatter(appDateFormatter()); 
        return conversionService;
    }

}
于 2014-10-30T06:39:59.980 回答
0

在 java configs 类中添加以下 bean。

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");

    return messageSource;
}

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver resolver = new SessionLocaleResolver();
    resolver.setDefaultLocale(Locale.ENGLISH);

    return resolver;
}

@Bean
public MessageSourceAccessor messageSourceAccessor(MessageSource messageSource){
    return new MessageSourceAccessor(messageSource, Locale.ENGLISH );
}

然后MessageSourceAccessor可以如下注入bean

@Autowired
private MessageSourceAccessor msgs;

获取消息字符串如下,

msgs.getMessage("controller.admin.save.success")

message_en.properties文件应该在/src/main/resources文件夹内。也为其他语言添加必要的属性文件。

希望这可以帮助。

于 2016-08-18T14:14:44.950 回答