Spring messageSource只能用作xml(而不是Spring-Java-Config)

时间:2014-09-21 16:11:06

标签: java xml spring spring-java-config

我有一个有效的Spring MVC项目,并希望将应用程序上下文配置从xml迁移到Java-Config。除了messageSource Bean之外,一切正常。


以下正常
此配置类由另一个配置类导入:

package gmm;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource({"classpath:applicationContext.xml"})
public class I18nConfiguration {

}

引用的applicationContext.xml文件:

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
">

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

</beans>

以下无法正常工作
将bean移动到java config:

package gmm;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;

@Configuration
public class I18nConfiguration {

    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource source = new ResourceBundleMessageSource();
        source.setBasename("messages");
        return source;
    }
}

当我使用这个java配置时,我只得到通常的???key.for.message???内容。调试输出并没有告诉我一些不寻常的事情 我不知道这里有什么问题。我的代码中有一些明显的错误吗?请告诉我,即使你现在没有解决方案,因为我觉得我现在有点愚蠢!这应该是非常容易的不是吗?


编辑:消息文件位于 src / main / resources 中,并命名为 messages_en.properties
Edit2:完整的项目源代码可以在这里找到:https://github.com/Katharsas/GMM/tree/PerfRevamp

1 个答案:

答案 0 :(得分:2)

好的,我解决了这个问题!

TLDR:我让Java-Config在另一个文件中定义了一个messageSource Bean(我没有注意到它)。该配置确实覆盖了我的Java-Config,但无法覆盖xml配置。所以xml工作,但Java-Config没有。

我是如何发现错误的:

我刚刚将两个版本的servlet启动日志复制到在线文本差异工具中(用虚拟文本替换时间戳后)

工作代码日志:

INFORMATION: Loading XML bean definitions from class path resource [applicationContext.xml]
        19  Sep 25, 2014 time org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
        20  INFORMATION: Overriding bean definition for bean 'messageSource': replacing [Generic bean: class [com.technologicaloddity.capturejsp.util.TechOddMessageSource]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\Users\Jan\Repositories\GMM\target\classes\com\technologicaloddity\capturejsp\util\TechOddMessageSource.class
]] with [Generic bean: class [org.springframework.context.support.ResourceBundleMessageSource]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [applicationContext.xml]]

不使用代码相同的行:

Sep 25, 2014 time org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader isOverriddenByExistingDefinition
INFORMATION: Skipping bean definition for [BeanMethod:name=messageSource,declaringClass=gmm.I18nConfiguration]: a definition for bean 'messageSource' already exists. This top-level bean definition is considered as an override.