복붙노트

[SPRING] 폴더 안에있을 때 MessageSource에 대한 ResourceBundle을 찾을 수 없습니다.

SPRING

폴더 안에있을 때 MessageSource에 대한 ResourceBundle을 찾을 수 없습니다.

리소스 번들을 Spring의 Message Source와 함께 사용하려고합니다. 내가하는 방식은 다음과 같습니다.

@Component
public class MessageResolver implements MessageSourceAware {

    @Autowired
    private MessageSource messageSource;

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

    public String getMessage(){
        return messageSource.getMessage("user.welcome", new Object[]{"Rama"} , Locale.US);
    }

}

그리고 내 폴더 구조는 다음과 같습니다.

messages_en_US.properties에는 한 줄만 있습니다.

user.welcome=Welcome {0}

다음은 사용 된 xml 구성입니다.

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

내가 얻는 오류는 다음과 같습니다.

WARNING: ResourceBundle [resourcebundles/messages] not found for MessageSource: Can't find bundle for base name resourcebundles/messages, locale en_US
Exception in thread "main" org.springframework.context.NoSuchMessageException: No message found under code 'user.welcome' for locale 'en_US'.

하지만 리소스 번들을 리소스 폴더 바로 아래로 이동하면 올바르게 작동합니다. 이 경우 사용중인 xml 구성은 다음과 같습니다.

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

ResourceBundleMessageSource를 사용해야하는 경우 자원 번들을 리소스 아래에 직접 배치해야합니까? 지정된 폴더에만 보관해야하는 경우이 작업을 수행 할 수있는 다른 방법이 있습니까?

감사!

해결법

  1. ==============================

    1.xml 파일의 messageSource bean에 대한 구성을 다음과 같이 변경하십시오.

    xml 파일의 messageSource bean에 대한 구성을 다음과 같이 변경하십시오.

    <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
        <property name="basename"> 
            <value>classpath*:resourcebundles/messages</value> 
        </property> 
    </bean>
    

    모든 특성 파일이 java의 클래스 경로에 있으므로 접두어 classpath *로 경로를 정의해야합니다. 그렇지 않으면 응용 프로그램의 웹 디렉토리를 조사합니다.

    희망이 당신을 도와줍니다. 건배.

  2. ==============================

    2.소년, 어쩌면 당신은 다음과 같이 XML 구성을 변경할 수 있습니다 :

    소년, 어쩌면 당신은 다음과 같이 XML 구성을 변경할 수 있습니다 :

    용도

    org.springframework.context.support.ReloadableResourceBundleMessageSource
    

    대신에

    org.springframework.context.support.ResourceBundleMessageSource
    

    모든 구성은 다음과 같습니다.

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:resourcebundles/messages" />
        <property name="useCodeAsDefaultMessage" value="true" />
    </bean>
    
  3. ==============================

    3.이제 거의 2015 년이고 Spring 4.1.2.RELEASE를 사용하고 있으며 대상 자원 번들을 선택하도록 messageSource bean을 구성해야하는 방식에 문제가 있습니다.

    이제 거의 2015 년이고 Spring 4.1.2.RELEASE를 사용하고 있으며 대상 자원 번들을 선택하도록 messageSource bean을 구성해야하는 방식에 문제가 있습니다.

    1) messageSource bean이 ReloadableResourceBundleMessageSource 유형 인 경우 작동하지 않습니다.

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.ReloadableResourceBundleMessageSource;
    
    @Configuration
    @ComponentScan(basePackages = { "com.intertech.service" })
    //@ImportResource({"classpath:spring/applicationContext-i18n.xml"})
    public class AppConfig {
    
      @Bean(name = "messageSource")
      public ReloadableResourceBundleMessageSource getMessageSource() {
          ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
          messageSource.setBasename("config/messages");
          messageSource.setDefaultEncoding("UTF-8");
          messageSource.setUseCodeAsDefaultMessage(true);
          return messageSource;
      }
    
    //  @Bean(name = "messageSource")
    //  public ResourceBundleMessageSource getMessageSource() {
    //      ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    //      messageSource.setBasename("config/messages");
    //      messageSource.setDefaultEncoding("UTF-8");
    //      messageSource.setUseCodeAsDefaultMessage(true);
    //      return messageSource;
    //  }
    }
    

    2) messageSource bean이 ResourceBundleMessageSource 유형이면 작동합니다.

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.ResourceBundleMessageSource;
    
    @Configuration
    @ComponentScan(basePackages = { "com.intertech.service" })
    //@ImportResource({"classpath:spring/applicationContext-i18n.xml"})
    public class AppConfig {
    
    //  @Bean(name = "messageSource")
    //  public ReloadableResourceBundleMessageSource getMessageSource() {
    //      ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    //      messageSource.setBasename("config/messages");
    //      messageSource.setDefaultEncoding("UTF-8");
    //      messageSource.setUseCodeAsDefaultMessage(true);
    //      return messageSource;
    //  }
    
      @Bean(name = "messageSource")
      public ResourceBundleMessageSource getMessageSource() {
          ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
          messageSource.setBasename("config/messages");
          messageSource.setDefaultEncoding("UTF-8");
          messageSource.setUseCodeAsDefaultMessage(true);
          return messageSource;
      }
    }
    

    3) 구성 클래스와 결합 된 XML 구성 파일을 사용하는 경우 기본 클래스가 구성 방법 (예 : 'config.messages'가 'config / messages'가 아닌)과 같이 클래스에서 어떻게 구성되는지 확인하십시오. (applicationContext -i18n.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="messageSource"
            class="org.springframework.context.support.ResourceBundleMessageSource"
            p:basename="config.messages"
            p:useCodeAsDefaultMessage="true"/>
    
        <!-- This will not work -->
        <!--
        <bean id="messageSource"
            class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
            p:basename="config/messages"
            p:useCodeAsDefaultMessage="true"/>
         -->
    </beans>
    

    과:

    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    
    @Configuration
    @ComponentScan(basePackages = { "com.intertech.service" })
    @ImportResource({"classpath:spring/applicationContext-i18n.xml"})
    public class AppConfig {
    
    //  @Bean(name = "messageSource")
    //  public ReloadableResourceBundleMessageSource getMessageSource() {
    //      ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    //      messageSource.setBasename("config/messages");
    //      messageSource.setDefaultEncoding("UTF-8");
    //      messageSource.setUseCodeAsDefaultMessage(true);
    //      return messageSource;
    //  }
    
    //  @Bean(name = "messageSource")
    //  public ResourceBundleMessageSource getMessageSource() {
    //      ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    //      messageSource.setBasename("config/messages");
    //      messageSource.setDefaultEncoding("UTF-8");
    //      messageSource.setUseCodeAsDefaultMessage(true);
    //      return messageSource;
    //  }
    }
    

    4) 가장 중요한 것은 ... webApplicationInitializer (web.xml이 없음)를 사용하는 경우, 발송자 서블릿의 컨텍스트가 아닌 루트 컨텍스트에 'messageSource'bean을 정의하는 구성 클래스를 등록해야한다는 것입니다.

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRegistration;
    
    import org.springframework.web.WebApplicationInitializer;
    import org.springframework.web.context.ContextLoaderListener;
    import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
    import org.springframework.web.servlet.DispatcherServlet;
    
    public class WebAppInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(ServletContext container) throws ServletException {
        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(AppConfig.class);
        // Manage the lifecycle of the root application context
        container.addListener(new ContextLoaderListener(rootContext));
        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
        dispatcherServlet.register(MvcConfig.class);
        // Register and map the dispatcher servlet
        ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(
                dispatcherServlet));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("*.htm");
        }
    }
    
  4. ==============================

    4.필자의 경우 Spring 4.3.2.RELEASE와 Java config, ReloadableResourceBundleMessageSource를 사용하여 템플릿 엔진을 bean으로 정의해야했다. 그렇지 않으면 내 메시지가 해결되지 않았다.

    필자의 경우 Spring 4.3.2.RELEASE와 Java config, ReloadableResourceBundleMessageSource를 사용하여 템플릿 엔진을 bean으로 정의해야했다. 그렇지 않으면 내 메시지가 해결되지 않았다.

    다음은 작동하는 구성의 샘플입니다.

    AppConfig.java

    import java.util.concurrent.TimeUnit;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.context.MessageSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.ReloadableResourceBundleMessageSource;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.spring4.SpringTemplateEngine;
    import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
    import org.thymeleaf.spring4.view.ThymeleafViewResolver;
    import org.thymeleaf.templatemode.TemplateMode;
    import org.thymeleaf.templateresolver.ITemplateResolver;
    
    @Configuration
    @EnableWebMvc
    @ComponentScan("myapp")
    public class AppConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
    
    private ApplicationContext applicationContext;
    
    private static final boolean CACHE_THYMELEAF_TEMPLATES = false;
    private final String UTF8_ENCODING = "UTF-8";
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
    
    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding(UTF8_ENCODING);
        resolver.setCache(CACHE_THYMELEAF_TEMPLATES);
        return resolver;
    }
    
    @Bean
    public TemplateEngine templateEngine() {
        //this method must be defined as a bean otherwise i18n messages are not found
        //if method defined as private TemplateEngine templateEngine() messages are not found
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setEnableSpringELCompiler(true);
        engine.addTemplateResolver(templateResolver());
        return engine;
    }
    
    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/thymeleaf/");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setSuffix(".html");
        resolver.setCacheable(CACHE_THYMELEAF_TEMPLATES);
        resolver.setCharacterEncoding(UTF8_ENCODING);
        return resolver;
    }   
    
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("WEB-INF/i18n/messages");
        messageSource.setUseCodeAsDefaultMessage(true);
        messageSource.setDefaultEncoding(UTF8_ENCODING);
        messageSource.setFallbackToSystemLocale(false);
        messageSource.setCacheSeconds((int)TimeUnit.HOURS.toSeconds(1));
        return messageSource;
    }
    
    }
    
  5. ==============================

    5.

     <!-- Application Message Bundle -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="resourcebundles/messages" />
    </bean>
    

    위와 같이 메시지 경로를 구성해야합니다. 또한 클래스 이름을 확인하십시오.

  6. ==============================

    6.나는 다음의 설정을 사용했고 잘 동작한다.

    나는 다음의 설정을 사용했고 잘 동작한다.

    <beans:bean id="messageSource class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <beans:property name="basename" value="classpath:resourcebundles/ScreenLabelResources" />
        </beans:bean>
    
  7. ==============================

    7.나에게 효과가 있었던 것은 정말 간단했다.

    나에게 효과가 있었던 것은 정말 간단했다.

    그것은

    <property name="basename">
                <value>locale\messages</value>
            </property>
    

    나는 그것을 바꿨다.

    <property name="basename">
                <value>locale/messages</value>
            </property>
    

    \ to / change는 나를 위해 그것을 고쳤다. MAC를 사용하고 있습니다.

    나는 classpath를 시도하지 않았다. 그것은 나를 위해 일하지 않았을지도 모른다.

  8. ==============================

    8.다음 구성을 사용했고 내 프로젝트에서 잘 작동합니다. 내 메시지. 속성은 아래 경로에 있습니다. .. \ WebContent \ WEB-INF \ resources

    다음 구성을 사용했고 내 프로젝트에서 잘 작동합니다. 내 메시지. 속성은 아래 경로에 있습니다. .. \ WebContent \ WEB-INF \ resources

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:WEB-INF/resources/messages" />
        <property name="useCodeAsDefaultMessage" value="true" />
    </bean>
    
  9. ==============================

    9.다음 구성을 사용했고 내 프로젝트에서 잘 작동합니다.

    다음 구성을 사용했고 내 프로젝트에서 잘 작동합니다.

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:configurations/messages" />
        <property name="useCodeAsDefaultMessage" value="true" />
    </bean>
    

    위치 : src \ main \ resources \ configurations \ messages_en.properties

  10. ==============================

    10.이것에 대한 YAML 버전

    이것에 대한 YAML 버전

      spring:
         messages:
           basename: i18n/validation, i18n/message # for multiple properties just use comma separated values
           encoding: UTF-8
    

    전체 설명을 보려면 설명서를 참조하십시오.

    또한 기본 MessageSource 빈은 classpath : i18n / validation과 같은 nonation을 사용할 필요가 없도록 이미 클래스 패스를 읽는 ResourceBundleMessageSource라는 것을 언급해야합니다.

  11. from https://stackoverflow.com/questions/11150869/resourcebundle-not-found-for-messagesource-when-placed-inside-a-folder by cc-by-sa and MIT license