自定义JacksonJaxbJsonProvider没有正确抛出异常

时间:2015-02-10 12:43:44

标签: json exception jackson jax-rs

我已经创建了一个自定义的JacksonJaxbJsonProvider,如下所示。

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;

import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.codehaus.jackson.map.module.SimpleModule;

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonJsonProvider extends JacksonJaxbJsonProvider {

    public JacksonJsonProvider() {
        super();
        ObjectMapper mapper = new ObjectMapper();
        //mapper.registerModule(new SimpleModule("jacksonJsonModule", null));
        mapper.setSerializationInclusion(Inclusion.NON_NULL);
        mapper.setSerializationInclusion(Inclusion.NON_DEFAULT);
        //mapper.
        //mapper.configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.configure(Feature.WRAP_EXCEPTIONS, true);
        mapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.WRAP_EXCEPTIONS, false);
        mapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        super.setMapper(mapper);
    }

}

在我的代码中,我抛出了带有errorMsg和errorCode的WebApplicationException。

当我使用“org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider”并抛出WebApplicationException时,我得到了正确的异常响应,如下所示

{
errorMsg: "Invalid input value passed, please correct the value"
errorCode: 400
}

但是当我使用上面提到的JacksonJsonProvider并抛出异常时,我总是得到500内部服务器错误。 :(

我缺少一些配置设置。请帮我搞清楚。

谢谢,
Pratz。

- - - - - - - - 编辑 对不起评论格式。我在这里写的是更好的代码格式。

在我的资源中,有@Path注释,我只是抛出异常。它看起来像这样

@ GET
@ Path("/{id}")
public User getUser(@ PathParam("id") Long userId) { 
    try {
        userService.getUser(userId);
    } catch(Exception e) {
        throw new (Response.status(statusCode).entity(new ErrorResource("User not found.", Status.BAD_REQUEST..getStatusCode())).build());
    }
}

1 个答案:

答案 0 :(得分:0)

我通过调试JacksonJsonProvider.writeTo方法解决了这个问题。我有一个errorResource类,它填充了正确的错误消息和错误代码,但是这个类缺少一个默认的构造函数,所以我的自定义JacksonJsonProvider在创建实例时失败了。
现在还有一个问题仍然存在,那就是它使用默认的JacksonJsonProvider而不是自定义的JacksonJsonProvider,但截至目前我将继续使用它:)

谢谢, Pratz