【问题标题】:MessageSource always returns the default messageMessageSource 始终返回默认消息
【发布时间】:2012-11-08 03:21:56
【问题描述】:

我正在尝试在 Spring 中使用 MessageSource 注入文本消息。我编写的程序编译得很好,但它总是打印出默认消息,而不是从 .properties 文件中获取正确的值。我一点头绪都没有。

这是尝试注入文本的 Circle 类:

 @Component
    public class Circle implements Shape {

        @Resource
        private Point center;
        @Autowired
        private MessageSource messageSource;

        public MessageSource getMessageSource() {
            return messageSource;
        }

        public void setMessageSource(MessageSource messageSource) {
            this.messageSource = messageSource;
        }

        public Point getCenter() {
            return center;
        }

        public void setCenter(Point center) {
            this.center = center;
        }

        @Override
        public void draw() {
            System.out.println(this.messageSource.getMessage("greeting", null, "Default Greeting", null));
            System.out.println(this.messageSource.getMessage("draw.circle", new Object[] {center.getX(), center.getY()}, "Required Drawing", null));

        }

这是 bean 配置文件的一部分:

...
    <bean id="center" class="java.awt.Point">
        <constructor-arg value="0" />
        <constructor-arg value="-20" />
    </bean>

    <bean id="messageSourse" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename">
                <value>messages</value>
        </property>
    </bean>

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

    <context:annotation-config/>

我将问候语和 draw.circle 存储在 messages.properties 文件中并编写了一个主类。但输出总是:

Default Greeting  
Required Drawing

有人知道我的情况可能出什么问题吗?

更新 感谢您的建议。我正在调试,这里好像出了点问题:

public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
        if (this.parentMessageSource != null) {
            return this.parentMessageSource.getMessage(code, args, defaultMessage, locale);
        }
        else {
            return renderDefaultMessage(defaultMessage, args, locale);
        }
    }

this.parentMessageSource 为 null,因此它决定呈现默认消息。但我还是不太明白什么是 parentMesssageSource 以及它怎么可以(不)为空?

【问题讨论】:

  • messages.properties 所在的位置。在 src 文件夹中。
  • 它位于一个名为 properties 的文件夹中,该文件夹与 src 位于同一文件夹中。但是我确实尝试将其移至 src 以查看它是否可以工作。
  • 你能试试这样吗..在src中创建一个包(com.messages)并将messages.properties放入包中......然后试试这个..
  • 我刚试过。没用。同时我通过调试发现了一些东西。我已经更新了我的帖子。看看这是否会为您提供任何线索.. 谢谢!
  • 我修好了。我使用的是 maven,可能是因为我搞砸了文件夹结构。所以我在其默认的 src/main/resources 文件夹中重新创建了另一个具有属性和 xml 文件的 maven 项目。问题解决了!

标签: java spring


【解决方案1】:

您必须使用 id="messageSource" 而不是 id="messageSourse"。 对于所有使用 Java 配置的人,您必须将 "messageSource()" 作为方法名称

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource resourceBundleMessageSource =
                new ResourceBundleMessageSource();
        resourceBundleMessageSource.setBasename(I18_PATH_TEMPLATE + "email_welcome");
        resourceBundleMessageSource.setDefaultEncoding("UTF-8");
        return resourceBundleMessageSource;
    }

【讨论】:

  • 除了亚历克西斯的回答之外,我相信如果找不到(在这种情况下名称错误),spring 会创建一个默认的空消息源,这样你就不会收到注入错误。
【解决方案2】:

可能 messageSource 无法选择您的消息文件。 ResourceBundleMessageSource 已覆盖 toString() 方法以显示 messageResource 配置。尝试使用一次。您也可以在messageSource 对象注入后,借助调试工具检查它是否已成功加载所有属性。

【讨论】:

    【解决方案3】:

    您的 bean id 拼写错误

    您写的是“messageSourse”,而不是“messageSource”。

    您必须有一个消息资源 bean 的 id,并且它应该始终是“messageSource”。

    【讨论】:

      【解决方案4】:

      属性文件的扩展名应该是.properties

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-30
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 2017-12-25
        相关资源
        最近更新 更多