Mùa xuân không có hỗ trợ chú thích cho Người chuyển đổi, nhưng bạn có thể tự xây dựng.
Tất cả bạn cần là một chú thích tùy chỉnh vòng loại (cho phép gọi nó là @AutoRegistered
) và một số loại chuyển đổi/Formatter đăng ký (cụ FormatterRegistrar
) mà đăng ký tất cả các Đậu mùa xuân với @AutoRegistered
chú thích này (và một số xml để đăng ký dịch vụ đăng ký này) .
Sau đó, bạn cần ghi chú chú thích của bạn với chú thích này (và một số chú thích khác để biến nó thành đậu mùa xuân) và đó là tất cả.
@AutoRegistered
chú thích:
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface AutoRegistered {}
dịch vụ đăng ký:
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);
}
}
}
}
cấu hình XML cho các công ty đăng ký:
<bean id="applicationConversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatterRegistrars">
<set>
<bean
class="AutoregisterFormatterRegistrar"
autowire="byType" />
</set>
</property>
</bean>
BTW cho chuyển đổi enum của bạn, bạn không cần một ConversionFactory
- một chuyển đổi đơn giản là đủ:
@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 "";
}
}
}
FormatterRegistrar? Tôi đoán bạn có nghĩa là FormatterRegistry ... Danh sách> autoRegisteredConverters tự động điền? ps. Các giải pháp ConverterFactory cho enums là nhỏ gọn hơn ... kiểm tra này [thực hiện] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/validation.html#core-convert -ConverterFactory-SPI) –
ApollonDigital
Đây là FormatterRegistrar (tính năng Spring 3.1) http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/format/FormatterRegistrar.html – Ralph