注册转换器和converterFactories与注解春季3 [英] Register converters and converterFactories with annotations in Spring 3

查看:271
本文介绍了注册转换器和converterFactories与注解春季3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

中首先...林春季相对较新的,我用的弹簧3.x和我不喜欢Spring的XML配置文件......我不想为每个重构我这样做,碰到更新XML文件..

First of all ... Im relatively new in Spring, I use spring 3.x and I DONT LIKE SPRING'S XML CONFIGURATION FILES ... I dont want for every refactoring I do, to run into XML file for updates ...

我想要的方式配置弹簧,对于任何要求,如果我有一些@ RequestParam / @ RequestBody / @ PathVariable等在我hadlers String以外的类型,春天就会值正确转换到该类型或放空到处理程序的ARGS(我从来没有在处理器使用的参数基本类型)。到目前为止好...

I'm trying to configure spring in a way that for any request, if I have some @RequestParam/@RequestBody/@PathVariable etc with type other than String in my hadlers, spring will convert values to that type correctly or put null to handler's args (I never use primitive types in handler arguments). So far so good ...

到现在为止我已经注册的所有转换器/ converterFactory类是这样的:

Until now I've registered all converter/converterFactory classes like this:

 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
     <property name="converters">
         <list>
             <!-- converters is a set of both converters and converterfactories -->
             <bean class="controller.converters.enumConverter" />
             <bean class="controller.converters.integerConverter" />
             <bean class="controller.converters.objects.FooConverter" />
             ...
         </list>
     </property>
 </bean>

有没有办法用注解注册转换器?

Is there any way to register converters with annotations?

还能出什么(或只是基本的东西)关于春天的XML与注解时进行,并得到一劳永逸摆脱XML配置的? ...怎么样?

Can anything (or just basic stuff) about spring XML be done with annotations only, and get rid of XML configuration once and for all? ... and how?

推荐答案

春节不具有转换器注解支持,但你可以建立自己的。

Spring does not have annotation support for Converters, but you can build your own.

所有你需要的是一个自定义限定注解(可以称之为 @AutoRegistered )和某种转换器/格式化注册处处长(实现的<一个href=\"http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/format/FormatterRegistrar.html\"相对=nofollow> FormatterRegistrar )的注册所有与此有关的Spring Bean @AutoRegistered 注释(有的XML注册该注册服务)。

All you need is an custom qualifier annotation (lets call it @AutoRegistered ) and some kind of Converter/Formatter Registrar (implements FormatterRegistrar) that registers all the Spring Beans with this @AutoRegistered annotation (and some xml to register this registration service).

然后你需要与这个注释(和其他一些注释,使其来注释conveter
一个Spring bean),这是所有。

Then you need to annotate your conveter with this annotation (and some other annotation to make it a spring bean) and that is all.

@AutoRegistered 注释:

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface AutoRegistered {}

注册服务:

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistrar;
import org.springframework.format.FormatterRegistry;

public class AutoregisterFormatterRegistrar implements FormatterRegistrar {

    /**
     * All {@link Converter} Beans with {@link AutoRegistered} annotation.
     * If spring does not find any matching bean, then the List is {@code null}!.
     */
    @Autowired(required = false)
    @AutoRegistered
    private List<Converter<?, ?>> autoRegisteredConverters;


    @Override
    public void registerFormatters(final FormatterRegistry registry) {
        if (this.autoRegisteredConverters != null) {
            for (Converter<?, ?> converter : this.autoRegisteredConverters) {
                registry.addConverter(converter);
            }
        }
    }
}

书记官长XML配置:

XML configuration for the registrar:

<bean id="applicationConversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatterRegistrars">
        <set>
            <bean
                class="AutoregisterFormatterRegistrar"
                autowire="byType" />
        </set>
    </property>
</bean>

BTW你的枚举器,你不需要 ConversionFactory - 一个简单的转换就足够了:

BTW for your enum converter you do not need a ConversionFactory - a simple converter is enough:

@AutoRegistered
@Component
public class EnumConverter implements Converter<Enum<?>, String> {

    /** Use the same immutable value instead of creating an new array every time. */
    private static final Object[] NO_PARAM = new Object[0];

    /** The prefix of all message codes. */
    private static final String PREFIX = "label_";

    /** The separator in the message code, between different packages
        as well as between package can class. */
    private static final String PACKAGE_SEPARATOR = "_";

    /** The separator in the message code, between the class name
        and the enum case name. */
    private static final String ENUM_CASE_SEPARATOR = "_";

    /** The message source. */
    private MessageSource messageSource;

    @Autowired
    public EnumConverter(final MessageSource messageSource) {
        if (messageSource == null) {
            throw new RuntimeException("messageSource must not be null");
        }

        this.messageSource = messageSource;
    }

    @Override
    public String convert(final Enum<?> source) {
        if (source != null) {
            String enumValueName = source.name();
            String code = PREFIX + source.getClass().getName().toLowerCase().
                  replace(".", PACKAGE_SEPARATOR)
            + ENUM_CASE_SEPARATOR + enumValueName.toLowerCase();

            String message = messageSource.getMessage(code, NO_PARAM, enumValueName,
                                                  LocaleContextHolder.getLocale());

             return message;
         } else {
            return "";
         }
     }   
}

这篇关于注册转换器和converterFactories与注解春季3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆