我在REST应用程序中使用与Java POJO对象映射的json请求时遇到问题。在请求json中,如果我传递一个整数值而不是一个布尔值,那么应用程序将抛出异常
org.codehaus.jackson.JsonParseException: Unexpected character ('e' (code 101)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: org.apache.catalina.connector.CoyoteInputStream@6ab41dbb; line: 2, column: 17]
当我创建一个实现ExceptionMapper-JsonParseException的提供程序类时,我能够将错误消息自定义为常见错误消息,但我需要特定的错误消息。
预期回应:
employee id cannot be a "string" or isSupervisor can be either be "true" or "false"
以下是项目中使用的罐子:
jackson-core-asl-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-xc-1.9.2.jar
jersey jars of version 1.2
other jars not related to this issue
Jdk5 environment
此应用程序是在apache tomcat 5和web.xml文件中运行的REST应用程序,Jackson库中的JacksonJsonProvider已配置并用于将json转换为Java对象转换。如果提供的json输入请求正确映射到POJO对象,则一切都按预期工作。只有在数据不匹配时才会抛出上面显示的异常。
答案 0 :(得分:1)
当spring无法将json绑定到请求对象时,将出现JsonMappingException。例如,您的字段是整数,但是您发送的数字非常大,大于整数。当您请求类型错误的请求时,另一个例外是JsonParseException。您的请求对象是字符串,例如,您发送整数。这两个异常都是HttpMessageNotReadableException的原因。因此,您必须处理此异常。而且,您必须检查原因以了解异常原因。 您可以使用来处理异常。
@ExceptionHandler(HttpMessageNotReadableException.class)
然后,您必须使用instanceof了解异常原因。
ex.getCause() instanceof JsonMappingException
或
ex.getCause() instanceof JsonParseException
有例外情况,您可以捕获无效数据。 对于JsonMappingException
JsonMappingException exception = (JsonMappingException) ex.getCause();
String invalidField = exception.getPath().get(0).getFieldName();
对于JsonParseException
JsonParseException exception = (JsonParseException) ex.getCause();
String field = exception.getProcessor().currentName();
ex.getCause()以上属于HttpMessageNotReadableException。
答案 1 :(得分:0)
您得到的不是数据不匹配的兼容性问题,而是一个难以解决的JSON解码错误。所以你最好的选择是查看底层输入,看看为什么你会得到一些声称是JSON的东西,但那不是(因为它不是有效的JSON内容)。
关于财产名称;应使用JsonParser.getCurrentName()
提供。如果您需要,则需要手动构建JsonParser
(通过ObjectMapper.getFactory().createParser(...)
,然后将其提供给readValue()
或ObjectMapper
的{{1}}方法。
最后,如果这是一个数据绑定问题(而不是解码),异常本身会有更多的信息。