我正在使用Jersey为外界提供java REST服务.我提供了一些采用JSON的功能,我将Jackson框架与jersey结合使用,将它们转换为POJO.
我有一个问题,如果错误的杰克逊格式被发送到服务器,答案(http响应的内容)是杰克逊特定的异常描述.如果我有一个带有属性"surname"的POJO并将json字符串中的"sursname"发送到服务器,我得到:
Unrecognized field "sursname" (Class XY), not marked as ignorable at [Source: sun.net.httpserver.FixedLengthInputStream@903025; line: 1, column: 49] (through reference chain: XY["sursname"])
Run Code Online (Sandbox Code Playgroud)
这很好,但我想有自己的响应内容,例如我自己的错误代码.我已经编写了一个自定义的ExceptionMapper,它应该映射所有Throwables.
@Provider
public class WebserviceExceptionMapper implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Exception e) {
e.printStackTrace();
return Response.status(400).entity("{\"errorcode\":\"CRITICAL_ERROR\"}").type(MediaType.APPLICATION_JSON).build();
}
}
Run Code Online (Sandbox Code Playgroud)
似乎在调用我的webservice方法之前抛出了jackson异常,所以我没有机会映射它?
有没有人有想法?非常感谢,对不起我的英语;)
我需要在Jersey中创建一个自定义ExceptionMapper来处理Jackson返回的JsonProcessingException。
Jackson库已经以JsonMappingExceptionMapper.java和JsonParseExceptionMapper.java(link)的形式包含此异常的ExceptionMapper提供程序。
如果在“ my.package”中为此异常映射器添加新的提供程序,则有关所选提供程序的结果将无法预测。有时它将选择“ my.package”中的提供程序,有时它将选择Jackson库中的提供程序。下面是我用来扫描软件包的代码。
PackgesResourceConfig packagesResourceConfig = new PackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");
Run Code Online (Sandbox Code Playgroud)
拟议的解决方案
目前,我正在通过手动过滤掉Jackson库中的提供程序来解决此问题。但是我真正想知道的是,是否有一种更可接受和更受支持的方式来执行此操作。
首先,我扩展PackagesResourceConfig。
public class FilteredPackgesResourceConfig extends PackagesResourceConfig {
private Set<Class<?>> classesToFilter = new HashSet<Class<?>>();
public FilteredPackgesResourceConfig(String... packages) {
super(packages);
}
public FilteredPackgesResourceConfig(Map<String, Object> props) {
super(props);
}
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = super.getClasses();
if (classes != null && classesToFilter != null) {
classes.removeAll(classesToFilter);
}
return classes;
}
public Set<Class<?>> getClassesToFilter() {
return classesToFilter;
}
public void setClassesToFilter(Set<Class<?>> classesToFilter) {
this.classesToFilter = classesToFilter;
} …Run Code Online (Sandbox Code Playgroud)