我使用平针织物构建了Rest,我尝试处理异常。 我注册了jackson如何使用这个类对json映射的所有操作默认json处理器:
@javax.ws.rs.ApplicationPath("/")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("controller");
register(JacksonFeature.class);
}
}
我定义了一个异常映射器来捕获一些异常,例如" UnauthorizedException"和" BadRequestException"使用以下课程:
@Provider
public class ClientExceptionMapper implements ExceptionMapper<BaseException>
{
@Override
public Response toResponse(BaseException ex)
{
System.out.println("qwertweryt");
if(ex instanceof UnauthorizedException)
{
System.out.println("Unauthorized!");
return (((UnauthorizedException)ex).getResponse());
}
else if(ex instanceof BadrequestException)
{
System.out.println("Badrequest!");
return (((BadrequestException)ex).getResponse());
}
return null;
}
}
其中BaseException,UnauthorizedException和BarequestException分别为:
public abstract class BaseException extends WebApplicationException
{
private Response r;
public BaseException(Response response)
{
r = response;
}
public Response getResponse()
{
return r;
}
}
public class UnauthorizedException extends BaseException
{
public UnauthorizedException(Response response)
{
super(response);
}
}
public class BadrequestException extends BaseException
{
public BadrequestException(Response response)
{
super(response);
}
}
所以,一切正常,直到我处理jackson异常...实际上我定义了另一个异常映射器,类似于第一个异常映射器来处理jackson生成的所有异常(例如JsonMappingException)但是没有工作。我向您报告我的申请所获得的错误:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "serverr" (Class controller.server.control.response.GetServerDetailsResponse), not marked as ignorable
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@701d7463; line: 1, column: 14] (through reference chain: controller.server.control.response.GetServerDetailsResponse["serverr"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:181)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:134)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:72)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:134)
我的第一个问题是:这两个类可能存在冲突,即同一个项目中没有两个异常映射器?第二个问题是:我该如何解决这个问题? 我希望我很清楚,并提前感谢你的帮助!
嗨,我刚读了一篇文章,其中提出的问题与我的问题相同;我向您报告问题的链接:Jersey: Returning 400 error instead of 500 when given invalid request body。 首先,我尝试在帖子的第一个答案中编写但与之前结果相同的代码:当我故意在请求正文中插入错误时,我总是获得500错误代码而不是400。 我还尝试将 @JsonIgnoreProperties(ignoreUnknown = true)放在处理拦截请求体的类之上,但对我来说并不起作用。
答案 0 :(得分:1)
我认为问题在于您没有将ExceptionMapper注册到应用程序运行时加载类提供程序中。 尝试使用以下代码将mapper类添加到它:
@javax.ws.rs.ApplicationPath("/")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("controller");
register(JacksonFeature.class);
register(ClientExceptionMapper.class);
}
}
希望它可以提供帮助:)