我已经创建了一个自定义的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());
}
}
答案 0 :(得分:0)
我通过调试JacksonJsonProvider.writeTo方法解决了这个问题。我有一个errorResource类,它填充了正确的错误消息和错误代码,但是这个类缺少一个默认的构造函数,所以我的自定义JacksonJsonProvider在创建实例时失败了。
现在还有一个问题仍然存在,那就是它使用默认的JacksonJsonProvider而不是自定义的JacksonJsonProvider,但截至目前我将继续使用它:)
谢谢, Pratz