|
|
|
@ -725,7 +725,6 @@ The SPI to implement type conversion logic is simple and strongly typed: |
|
|
|
public interface Converter<S, T> { |
|
|
|
public interface Converter<S, T> { |
|
|
|
|
|
|
|
|
|
|
|
T convert(S source); |
|
|
|
T convert(S source); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -754,7 +753,6 @@ Consider `StringToInteger` as an example for a typical `Converter` implementatio |
|
|
|
public Integer convert(String source) { |
|
|
|
public Integer convert(String source) { |
|
|
|
return Integer.valueOf(source); |
|
|
|
return Integer.valueOf(source); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -775,7 +773,6 @@ example, when converting from String to java.lang.Enum objects, implement |
|
|
|
public interface ConverterFactory<S, R> { |
|
|
|
public interface ConverterFactory<S, R> { |
|
|
|
|
|
|
|
|
|
|
|
<T extends R> Converter<S, T> getConverter(Class<T> targetType); |
|
|
|
<T extends R> Converter<S, T> getConverter(Class<T> targetType); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -833,7 +830,6 @@ by a field annotation, or generic information declared on a field signature. |
|
|
|
public Set<ConvertiblePair> getConvertibleTypes(); |
|
|
|
public Set<ConvertiblePair> getConvertibleTypes(); |
|
|
|
|
|
|
|
|
|
|
|
Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); |
|
|
|
Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -872,12 +868,9 @@ such as a `static valueOf` method, is defined on the target class. |
|
|
|
public interface ConditionalConverter { |
|
|
|
public interface ConditionalConverter { |
|
|
|
|
|
|
|
|
|
|
|
boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType); |
|
|
|
boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public interface ConditionalGenericConverter |
|
|
|
public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter { |
|
|
|
extends GenericConverter, ConditionalConverter { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1079,6 +1072,7 @@ Where Formatter extends from the Printer and Parser building-block interfaces: |
|
|
|
[subs="verbatim,quotes"] |
|
|
|
[subs="verbatim,quotes"] |
|
|
|
---- |
|
|
|
---- |
|
|
|
public interface Printer<T> { |
|
|
|
public interface Printer<T> { |
|
|
|
|
|
|
|
|
|
|
|
String print(T fieldValue, Locale locale); |
|
|
|
String print(T fieldValue, Locale locale); |
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
@ -1089,6 +1083,7 @@ Where Formatter extends from the Printer and Parser building-block interfaces: |
|
|
|
import java.text.ParseException; |
|
|
|
import java.text.ParseException; |
|
|
|
|
|
|
|
|
|
|
|
public interface Parser<T> { |
|
|
|
public interface Parser<T> { |
|
|
|
|
|
|
|
|
|
|
|
T parse(String clientValue, Locale locale) throws ParseException; |
|
|
|
T parse(String clientValue, Locale locale) throws ParseException; |
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
@ -1142,7 +1137,6 @@ Consider `DateFormatter` as an example `Formatter` implementation: |
|
|
|
dateFormat.setLenient(false); |
|
|
|
dateFormat.setLenient(false); |
|
|
|
return dateFormat; |
|
|
|
return dateFormat; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1169,7 +1163,6 @@ an Annotation to a formatter, implement AnnotationFormatterFactory: |
|
|
|
Printer<?> getPrinter(A annotation, Class<?> fieldType); |
|
|
|
Printer<?> getPrinter(A annotation, Class<?> fieldType); |
|
|
|
|
|
|
|
|
|
|
|
Parser<?> getParser(A annotation, Class<?> fieldType); |
|
|
|
Parser<?> getParser(A annotation, Class<?> fieldType); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1229,7 +1222,6 @@ To trigger formatting, simply annotate fields with @NumberFormat: |
|
|
|
|
|
|
|
|
|
|
|
@NumberFormat(style=Style.CURRENCY) |
|
|
|
@NumberFormat(style=Style.CURRENCY) |
|
|
|
private BigDecimal decimal; |
|
|
|
private BigDecimal decimal; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1251,7 +1243,6 @@ The example below uses @DateTimeFormat to format a java.util.Date as a ISO Date |
|
|
|
|
|
|
|
|
|
|
|
@DateTimeFormat(iso=ISO.DATE) |
|
|
|
@DateTimeFormat(iso=ISO.DATE) |
|
|
|
private Date date; |
|
|
|
private Date date; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1283,7 +1274,6 @@ Review the FormatterRegistry SPI below: |
|
|
|
void addFormatterForFieldType(Formatter<?> formatter); |
|
|
|
void addFormatterForFieldType(Formatter<?> formatter); |
|
|
|
|
|
|
|
|
|
|
|
void addFormatterForAnnotation(AnnotationFormatterFactory<?, ?> factory); |
|
|
|
void addFormatterForAnnotation(AnnotationFormatterFactory<?, ?> factory); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1311,7 +1301,6 @@ FormatterRegistry: |
|
|
|
public interface FormatterRegistrar { |
|
|
|
public interface FormatterRegistrar { |
|
|
|
|
|
|
|
|
|
|
|
void registerFormatters(FormatterRegistry registry); |
|
|
|
void registerFormatters(FormatterRegistry registry); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1469,7 +1458,6 @@ JSR-303 allows you to define declarative validation constraints against such pro |
|
|
|
|
|
|
|
|
|
|
|
@Min(0) |
|
|
|
@Min(0) |
|
|
|
private int age; |
|
|
|
private int age; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
@ -1542,7 +1530,6 @@ the Spring Validation API: |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private Validator validator; |
|
|
|
private Validator validator; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
---- |
|
|
|
---- |
|
|
|
|
|
|
|
|
|
|
|
|