복붙노트

[SPRING] 데이터베이스 값을 가진 Spring 태그를 덮어 쓴다.

SPRING

데이터베이스 값을 가진 Spring 태그를 덮어 쓴다.

나는 속성 파일에서 메시지를 표시하기 위해 Spring을 사용하고 있습니다. 로그인 한 사용자를 기반으로 데이터베이스의 값을 사용하려면 태그를 재정의 할 수 있어야합니다. 이 값이 없으면 현재 속성 파일의 현재 값을 기본값으로 사용하고 싶습니다.

누군가이 코드를 도와 줄 수 있습니까? AbstractMessageSource에 대해 읽었지만 구현 방법이 불분명합니다.

감사

해결법

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

    1.사용자 지정 메시지 소스를 구현해야합니다. 그것은 AbstractMessageSource를 확장하고 abstract resolveCode (java.lang.String, java.util.Locale) 메소드를 구현하는 클래스입니다. 거의 동일한 질문이 Grails에 대한 솔루션이지만, 시작하는 것이 좋은 시점이라고 생각합니다.

    사용자 지정 메시지 소스를 구현해야합니다. 그것은 AbstractMessageSource를 확장하고 abstract resolveCode (java.lang.String, java.util.Locale) 메소드를 구현하는 클래스입니다. 거의 동일한 질문이 Grails에 대한 솔루션이지만, 시작하는 것이 좋은 시점이라고 생각합니다.

    Spring 포럼에서 이러한 스레드를 살펴보십시오.

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

    2.아래에 포함 된 DatabaseMessageSource라는 클래스를 작성했습니다. 각 호출마다 데이터베이스에 충돌하지 않도록 캐시를 구현해야합니다. 이 링크도 도움이되었습니다. 저를 올바른 방향으로 인도 해 주신 Skaffman과 PrimosK에게 감사드립니다.

    아래에 포함 된 DatabaseMessageSource라는 클래스를 작성했습니다. 각 호출마다 데이터베이스에 충돌하지 않도록 캐시를 구현해야합니다. 이 링크도 도움이되었습니다. 저를 올바른 방향으로 인도 해 주신 Skaffman과 PrimosK에게 감사드립니다.

    public class DatabaseMessageSource extends ReloadableResourceBundleMessageSource {
    
        @Autowired
        private MyDao myDao;
    
    
        protected MessageFormat resolveCode(String code, Locale locale) {
    
            MyObj myObj = myDao.findByCode(code);
    
            MessageFormat format;
    
            if (myObj!= null && myObj.getId() != null) {
    
                format = new MessageFormat(myObj.getValue(), locale);
    
            } else {
    
                format = super.resolveCode(code, locale);
    
            }
    
            return format;
    
        }
    
        protected String resolveCodeWithoutArguments(String code, Locale locale) {
    
            MyObj myObj = myDao.findByCode(code);
    
            String format;
    
            if (myObj != null && myObj.getId() != null) {
    
                format = myObj.getValue();
    
            } else {
    
                format = super.resolveCodeWithoutArguments(code, locale);
    
            }
    
            return format;
    
        }
    
    }
    

    새로 생성 된 클래스를 가리 키도록 applicationContext를 업데이트했습니다. 나는 그것을 다음과 같이 바꿨다 :

    <bean id="messageSource" class="com.mycompany.mypackage.DatabaseMessageSource">
        <property name="basenames">
            <list>
                <value>classpath:defaultMessages</value>
            </list>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>    
    </bean>`enter code here`
    
  3. ==============================

    3.의 동작을 변경할 필요가 없으며 메시지를 가져 오는 위치를 변경하면됩니다.

    의 동작을 변경할 필요가 없으며 메시지를 가져 오는 위치를 변경하면됩니다.

    디폴트에서는, MessageSource 형의 문맥, 또는 그 서브 클래스의 형태로 messageSource bean를 사용합니다. MessageSource를 구현하는 클래스를 작성하여 contextSource에 추가 할 수있다.

    AbstractMessageSource는 자신의 MessageSource를 작성하기위한 편리한 출발점 일뿐입니다. 그것은 당신을 위해 몇 가지 작업을 수행하고 하위 클래스로 만듭니다.

  4. from https://stackoverflow.com/questions/10623388/override-springmessage-tag-with-database-values by cc-by-sa and MIT license