如何解决通过Jackson2ObjectMapperBuilder设置自定义日期格式,导致请求处理在异常后继续
我有一个MockMvc测试,用于测试对控制器的JSON有效负载是否经过验证,并为org.springframework.data.mapping.PropertyReferenceException
和org.springframework.http.converter.HttpMessageConversionException
呈现HTTP 400(错误请求)。
各个异常处理程序的实现如下。
@ControllerAdvice
public class LocalExceptionHandler {
@ExceptionHandler(PropertyReferenceException.class)
public ResponseEntity<Object> handlePropertyReferenceException(PropertyReferenceException ex) {
return new ResponseEntity<>(ex.getMessage(),HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(HttpMessageConversionException.class)
public ResponseEntity<Object> handleHttpMessageConversionException(HttpMessageConversionException ex) {
return new ResponseEntity<>(ex.getMessage(),HttpStatus.BAD_REQUEST);
}
}
我正在使用Spock规范来实施测试。设置如下。
MockMvc mvc
public JsonSerializer[] buildJsonSerializers() {
return new JsonSerializer[]{new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)),new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))};
}
Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
builder.simpleDateFormat(DATE_TIME_FORMAT);
builder.serializers(buildJsonSerializers());
};
}
protected ObjectMapper buildObjectMapper() {
def objectMapperBuilder = new Jackson2ObjectMapperBuilder()
jsonCustomizer().customize(objectMapperBuilder)
objectMapperBuilder.modules(new MoneyModule()
.withMonetaryAmount(Money::of)
.withAmountFieldName("number")
.withFormattedFieldName("pretty"))
objectMapperBuilder.build()
}
def setup() {
ObjectMapper mapper = buildObjectMapper()
def mockMvcBuilder = MockMvcBuilders
.standaloneSetup(controller)
.setControllerAdvice(LocalExceptionHandler.class)
.setMessageConverters([new MappingJackson2HttpMessageConverter(mapper)]
.toArray(new HttpMessageConverter[1]))
.setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
mvc = mockMvcBuilder.build()
}
因此,以上设置仅通过定制程序设置日期格式,然后使用Jackson2ObjectMapperBuilder
构建对象映射器。
该设置的问题在于,生成器正在导致对象映射器配置,从而导致怪异的MockMvc行为。
当向控制器发布错误的请求时,上述异常处理程序之一将引发并处理适当的Exception,但不会停止请求处理并调用controller方法。 运行生产代码(作为Spring Boot应用程序)时,使用HTTP 400可以很好地处理错误。
只需删除构建器并模仿测试所需的配置(这是一种正确的日期时间格式),测试就会按预期工作,并且在异常处理后停止请求处理。
所以基本上我不使用构建器
def mapper = new ObjectMapper()
mapper.registerModule(new MoneyModule()
.withMonetaryAmount(Money::of)
.withAmountFieldName("number")
.withFormattedFieldName("pretty"))
SimpleModule serializerModule = new SimpleModule()
Arrays.asList(buildJsonSerializers())
.forEach({ s -> serializerModule.addSerializer(s.handledType(),s) })
mapper.registerModule(serializerModule)
因此,看起来构建器确实在添加一些MockMvc不能正确处理的配置。 希望能找到解决此问题的提示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。