使用jackson库获取导致JacksonParseException的属性或字段名称

时间:2015-06-11 18:31:09

标签: java json rest jersey jackson

我在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对象,则一切都按预期工作。只有在数据不匹配时才会抛出上面显示的异常。

2 个答案:

答案 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}}方法。

最后,如果这是一个数据绑定问题(而不是解码),异常本身会有更多的信息。