在使用Web MVC开发REST API的Spring启动应用程序中。一切正常。
为了将String转换为ZonedDateTime,我创建了这个注释:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DateTimeFormatter {
}
这是自定义格式化程序:
public class ZonedDateTimeFormatter implements Formatter<ZonedDateTime> {
@Override
public String print(ZonedDateTime zoneddateTime, Locale locale) {
return .....
}
@Override
public ZonedDateTime parse(String text, Locale locale) throws ParseException {
return ......
}
}
这就是我添加格式化程序的方式,
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@Configuration
public class IndexApplication extends SpringBootServletInitializer {
...
@Configuration
public static class ApplicationFormatterRegistrar extends WebMvcConfigurerAdapter implements FeignFormatterRegistrar {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldAnnotation(new ZonedDateTimeAnnotationFormatterFactory());
}
@Override
public void registerFormatters(FormatterRegistry registry) {
registry.addFormatter(new ZonedDateTimeFormatter());
}
}
}
这是我测试应用程序的方法(Spring mockmvc):
this.mockMvc = MockMvcBuilders.standaloneSetup(indexResource).build();
......
@Test
public void should_accept_valid_request() throws Exception {
when(service.getSomething(id, begin, end)).thenReturn(somevalue);
mockMvc.perform(
get("/index/{id}", 1)
.param("start", "2011-12-03T10:15:30")
.param("end", "2011-12-03T10:15:30")
).andExpect(status().isOk());
}
一切正常。问题是我想将自定义注释@DateTimeFormatter
放在所有项目的公共jar中,在这种情况下,Spring MVC不会注册自定义转换器!我不明白为什么。
非常感谢您的帮助。
答案 0 :(得分:1)
我能够以这种方式注册自定义格式化程序:
FormattingConversionService conversionService = new FormattingConversionService();
conversionService.addFormatterForFieldAnnotation(new ZonedDateTimeAnnotationFormatterFactory());
this.mockMvc = MockMvcBuilders.standaloneSetup(indexResource).setConversionService(conversionService).build();
即使格式化程序已在配置中注册,我也不知道为什么我应该为测试执行此操作。