Источник весеннего сообщения, GetMessage в bean XML?

#java #spring

#java #весна

Вопрос:

Я настроил свои ресурсы следующим образом:

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

Мой файл свойств:

 battle.name=TestBattle
 

Я хотел бы получить доступ к тексту «TestBattle», когда я использую компонент:

 <bean id="battlefield" class="com.mypackage.Battlefield" scope="prototype">
    <constructor-arg index="0" value="battle.name" />
    <constructor-arg index="1" ref="armies" />
</bean>
 

Я хочу повторно просмотреть сообщение в файле свойств в этой строке

 <constructor-arg index="0" value="battle.name" />
 

Есть ли способ сделать это, не заходя в java, используя

 getMessage("battle.name",...
 

код на java?

Ответ №1:

По крайней мере, вы могли бы использовать spel для этого.

например

 <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
    <constructor-arg ref="messageSource" />
</bean>

<bean id="battlefield" class="com.mypackage.Battlefield" scope="prototype">
    <constructor-arg index="0" value="#{messageSourceAccessor.getMessage('battle.name')}" />
    <constructor-arg index="1" ref="armies" />
</bean>
 

Однако это кажется громоздким, если вам приходится переводить много кодов.

Другой вариант — использовать String to String PropertyEditor для выполнения перевода.

 public class MessageSourcePropertyEditor extends PropertyEditorSupport {

    private MessageSourceAccessor messageSourceAccessor;

    public MessageSourcePropertyEditor(MessageSource messageSource) {
        this.messageSourceAccessor = new MessageSourceAccessor(messageSource);
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        String value = text;

        if (text.startsWith("i18n:")) {
            value = messageSourceAccessor.getMessage(text.substring(5));
        }

        setValue(value);
    }
}

public class MessageEditorRegistrar implements PropertyEditorRegistrar {

    private MessageSource messageSource;

    @Override
    public void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(String.class, new MessageSourcePropertyEditor(messageSource));

    }

    public MessageSource getMessageSource() {
        return messageSource;
    }

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

И используйте префикс i18n: для перевода кодов, т.Е.

 <bean id="propertyEditorConfigure" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="propertyEditorRegistrars">
        <list>
            <bean class="message.MessageEditorRegistrar">
                <property name="messageSource" ref="messageSource" />
            </bean>
        </list>
    </property>
</bean>

<bean id="battlefield" class="com.mypackage.Battlefield" scope="prototype">
    <constructor-arg index="0" value="i18n:battle.name" />
    <constructor-arg index="1" ref="armies" />
</bean>