相关疑难解决方法(0)

ExceptionMapper的Jersey/Jackson Exception问题

我正在使用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异常,所以我没有机会映射它?

有没有人有想法?非常感谢,对不起我的英语;)

java exception-handling exception jersey jackson

15
推荐指数
2
解决办法
6028
查看次数

泽西岛的主要收录服务提供商

我需要在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)

java jersey jackson

5
推荐指数
1
解决办法
3642
查看次数

标签 统计

jackson ×2

java ×2

jersey ×2

exception ×1

exception-handling ×1