2011-04-29 3 views
12

저지를 사용하여 외부 세계에 Java REST 서비스를 제공하고 있습니다. JSON을 사용하는 몇 가지 기능을 제공하고 잭슨 프레임 워크를 저지와 함께 사용하여 POJO로 변환합니다.ExceptionMapper로 저지/잭슨 예외 문제가 발생했습니다.

잘못된 잭슨 형식이 서버로 전송되면 응답 (http 응답 내용)이 잭슨 특정 예외 설명입니다.

Unrecognized field "sursname" (Class XY), not marked as ignorable at [Source: [email protected]; line: 1, column: 49] (through reference chain: XY["sursname"]) 

그게 아주 좋아,하지만 난에 대한 내 자신의 응답 내용을 가지고 싶다 : 나는 속성 "성"과 POJO를 가지고 서버에 JSON 문자열에서 "sursname"를 보낼 경우, 내가 얻을 내 자신의 오류 코드 예입니다. 이미 모든 Throwables를 매핑해야하는 사용자 지정 ExceptionMapper을 작성했습니다.

@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(); 
    } 
} 

내 webservice 메서드가 호출되기 전에 jackson 예외가 throw 된 것 같습니다. 그래서 매핑 할 기회가 없습니까?

누구나 아이디어가 있습니까? 큰 감사와 내 영어에 대한 미안;)

답변

1

당연히 잭슨 예외가 발생합니다 : 귀하의 방법에서 기대하고있는 개체를 만들기 위해 잭슨 공급자가 호출됩니다. 그러나 ExceptionMapper를 사용하면 예외는 물론 공급자 예외도 매핑 할 수 있어야합니다.

제공자가 등록되어 있습니까? 귀하의 방법에서 예외를 던져 공급자가 아닌 경우 호출 되는가?

이전 질문에 대한 대답이 "예"이면 Throwable 대신 구체적인 예외를 위해 ExceptionMapper를 구현하십시오.

-1

JasonParseException의 ExceptionMapper가 도움을 주셔서 감사합니다. 내 프로젝트에서 잭슨 병 파일을 제거하고 잭슨 소스를 포함 시켰습니다. 그런 다음 ord.codehaus.jackson.jaxrs.JsonParseExceptionMapper 및 JacksonMappingExceptionMapper를 수정하여 사용자 정의 응답 내용을 반환했습니다. 나는 그것에 만족하지 않지만, 지금은 효과가있다!

도움 주셔서 감사합니다.

2

Jackson과 Apache CXF를 사용하는 동안 비슷한 문제가 발생했습니다. 내 JAX-RS 메소드에서 예외가 발생하지 않고 대신 JacksonJsonProvider에서 발생한 경우 예외 매퍼가 호출되지 않았습니다. 내 경우의 해결책은 JacksonJsonProvider을 확장하고 특정 Jackson Jackson 예외를 잡아서 WebApplicationException으로 다시 던집니다.

여기 내 확장 JacksonJsonProvider 내 오버라이드 (override) readFrom 방법입니다 :

@Override 
    public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, 
      MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException { 
     try { 
      return super.readFrom(type, genericType, annotations, mediaType, httpHeaders, entityStream); 
     } catch (JsonParseException jpe) { 
      throw new WebApplicationException(jpe, Response.status(Status.BAD_REQUEST) 
        .entity(new ErrorEntity("Malformed json passed to server: \n" + jpe.getMessage())).build()); 
     } catch (JsonMappingException jme) { 
      throw new WebApplicationException(jme, Response 
        .status(Status.BAD_REQUEST) 
        .entity(new ErrorEntity("Malformed json passed to server, incorrect data type used: \n" 
          + jme.getMessage())).build()); 
     } 
    } 
13

그 전에 예외를 catch 잭슨 라이브러리가 자신의 예외 매퍼를 제공하기 때문에 예외를 캐치하지 않았던 사용자 정의 ExceptionMapper는 이유, 당신의 genereal 예외 매퍼에 의해 잡힐 것입니다.

일부 사용자는 JsonParseExceptionMapper 및 JacksonMappingExceptionMapper에 대해 자체적 인 예외 매퍼를 구현해야하지만 일관성없는 결과가 발생한다고 제안하는 사용자도 있습니다. See this issue on their GitHub.

이 문제를 해결하려면 내장 된 예외 매퍼가 등록되어 있지 않은지 확인해야합니다.당신이 잭슨-jaxrs-제공 JSON에 대한 라이브러리를 사용하는 경우 : 잭슨-jaxrs-JSON-제공을, 당신은 가에 JacksonJaxbJsonProvider.class 또는 중 하나 JacksonJsonProvider.class 등록되어 있는지 확인하여 Application 클래스 : 그것은 ExceptionMappers 내장 등록으로

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     register(JacksonJaxbJsonProvider.class) 
    } 
} 

에서, JacksonFeature.class 알고 있어야합니다. 또한 jersey-media-json-jackson 라이브러리에서 멀리 떨어져 있어야합니다.이 라이브러리는 자동으로 예외 메핑 기능을 일부 추가합니다. 아무 것도하지 않아도됩니다.

+3

, 대부분 exceptionmappers을 언급, 그것에 대해 많은 스레드를 읽어 : 여기 내 web.xml의의를 무시 부분입니다. 마침내 당신이 답을 찾았습니다. 문제를 올바르게 설명하는 유일한 해결책은 무엇입니까, 왜 예외 마개는 작동하지 않고 간단한 해결책이 필요한지 알아보십시오. 감사! 대답은 시장으로 받아 들여야합니다. – patman

+1

최고의 답변! JacksonJsonProvider.class 만 등록 할 수 있지만 JacksonJaxbJsonProvider.class는 사용할 수 없습니다. 이것은 정말로 받아 들여진 대답이어야합니다. – wolf97084

0

동일한 문제가있어서 ExceptionMapper를 재정의했습니다. 완전한! 내가 할 필요가 있고 100 %를 이해하지 못하는 한 가지 추가 사항은 내 응용 프로그램을 위해 JacksonProvider를 재정의하는 방법이었습니다. (Jersey 버전과 관련이 있는지는 알 수 없습니다 - 2.19). 난 그냥이 문제를 꽤 많은 시간을 보냈다

<init-param> 
<param-name>jersey.config.server.provider.classnames</param-name> 
    <param-value> 
     com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider 
    </param-value> 

관련 문제