2015-06-22 2 views
1

Использование пружинного ленточного потока 2, Фортетера по типу поля эффективен , но Formatter for Field Annotation нет.Spring Formatter для полевой аннотации не работает в веб-потоке

getPrint и getParser не называется. (по типу поля, они называются)

Я потратил много времени на это, , но не имеет хороших результатов.

Bean для страницы

public TestBean { 
    @TestFormat 
    private String test; 
    ... 
} 

Аннотация

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

AnnotationFormatterFactory

public class TestFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<TestFormat>,Serializable { 
    @Override 
    public Set<Class<?>> getFieldTypes() { 
     Set<Class<?>> set = new HashSet<Class<?>>(); 
     set.add(TestFormat.class); 
     return set; 
    } 
    @Override 
    public Printer<?> getPrinter(TestFormat annotation, Class<?> fieldType) { 
     return new TestFormatter(); 
    } 
    @Override 
    public Parser<?> getParser(TestFormat annotation, Class<?> fieldType) { 
     return new TestFormatter(); 
    } 
} 

форматтера

public class TestFormatter implements Formatter<String>{ 
    @Override 
    public String print(String str, Locale locale) { 
     return str.substring(0, str.indexOf("parsed")); // example 
    } 
    @Override 
    public String parse(String input, Locale locale) throws ParseException { 
     return input + "parsed"; // example 
    } 
} 

ApplicationFormatterRegistrar

public class ApplicationFormatterRegistrar implements FormatterRegistrar { 
    @Override 
    public void registerFormatters(FormatterRegistry registry) { 
     registry.addFormatterForFieldAnnotation(new TestFormatAnnotationFormatterFactory()); 
    } 
} 

Конфигурация SpringMVC

<bean id="applicationConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
    <property name="formatterRegistrars"> 
     <set> 
      <ref local="applicationFormatterRegistrar"/> 
     </set> 
    </property> 
</bean> 
<bean id="applicationFormatterRegistrar" class="package.ApplicationFormatterRegistrar"/> 
Конфигурация

Пружина WebFlow

<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService" > 
    <constructor-arg ref="applicationConversionService"/> 
</bean> 
<webflow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService"/> 

это может быть связано, но я не мог найти solution

Spring Web Flow 2.4.1 
Spring 4.1.6 
Thymeleaf 2.1.4 
+0

извините за мои неудачные перерывы. – user1451619

+0

ваш ['getFieldTypes'] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/format/AnnotationFormatterFactory.html#getFieldTypes--) должен добавить' String.class' в вместо «TestFomat», в настоящее время это не так. Он представляет типы полей, которые можно аннотировать, в настоящее время вы говорите, что «TestFormat» может быть аннотирован с помощью «TestFormat». Если вы хотите, чтобы 'String' можно было аннотировать с помощью' TestFormat'. –

+0

Это сработало! Я пропустил. Благодарим вас за точные указания. – user1451619

ответ

0

При реализации AnnotationFormatterFactory то его метод getFieldTypes должен возвращать тип полей аннотацию относится. С вашей текущей конфигурацией вы говорите, что TestFormat может быть аннотирован с TestFormat.

Я подозреваю, однако, что вы хотите, чтобы указать String можно аннотировать с TestFormat.

Вместо этого измените свою реализацию, чтобы вернуть String.class.

public class TestFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<TestFormat>,Serializable { 
    @Override 
    public Set<Class<?>> getFieldTypes() { 
     return Collections.singleton(String.class); 
    } 
    ... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^