2014-09-05 123 views
2

我已經使用澤西建立了一個休息室,我嘗試處理異常。 我註冊傑克遜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); 
    } 
} 

因此,所有工作正常,直到我處理傑克遜異常......事實上,我定義了另一個異常映射器,類似於第一個,以處理傑克遜生成的所有異常(例如JsonMappingException),但不起作用。我報告你,我得到錯誤由我的應用程序:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "serverr" (Class controller.server.control.response.GetServerDetailsResponse), not marked as ignorable 
at [Source: [email protected]; 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)放在攔截請求正文的類上面,但對我不起作用。

回答

1

我認爲問題在於您還沒有將您的ExceptionMapper註冊到應用程序運行時加載類提供程序中。 嘗試映射器類添加到它用下面的代碼:

@javax.ws.rs.ApplicationPath("/") 
    public class MyApplication extends ResourceConfig { 
     public MyApplication() { 
      packages("controller"); 
      register(JacksonFeature.class); 
      register(ClientExceptionMapper.class);   
     } 
    } 

希望它可能會有所幫助:)