2017-02-27 3 views
0

JAX-RSを使用して、次のように、HTTPステータスコードよりも洗練されたレスポンスを必要としないExceptionMapperを正常に実装しました。JAX-RS ExceptionMapperがMessageBodyProviderNotFoundExceptionをスローする

@Provider 
public class ISBNNotFoundManager implements ExceptionMapper<ISBNNotFoundException>{ 

    @Override 
    public Response toResponse(ISBNNotFoundException exception) { 
     return Response.status(NOT_FOUND).build(); 
    } 
} 

期待どおりに動作します。

しかし、Beanの検証に失敗した場合には、より役に立ちたいと思っています。次のコードスニペットの結果、MessageBodyProviderNotFoundExceptionが発生します。豆の検証が応答を発生

@Provider 
public class ConstraintViolationExceptionMapper implements 
        ExceptionMapper<ConstraintViolationException> { 

    @Override 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response toResponse(ConstraintViolationException exception) { 

     final Map<String, String> errorResponse = 
     exception.getConstraintViolations() 
     .stream() 
     .collect(
      Collectors.toMap(o -> o.getPropertyPath().toString(), o -> o.getMessage())); 


     return Response.status(Response.Status.BAD_REQUEST).entity(errorResponse).build(); 
    } 

} 

HTTPレスポンスコード500が含まれており、根本的な原因は、次のように与えられる:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: 
MessageBodyWriter not found for media type=application/json, 
type=class java.util.HashMap, genericType=class java.util.HashMap. 

は、私が試してみました何を動作しませんでした:

  • GenericEntityのようにマップをラップします。上記と同じ結果:として、

    • カスタムPOJO、DataIntegrityValidationにマップラッピング:

      新しいGenericEntity>(はErrorResponse){}私は仕事を試み何

    次の:

    @XmlRootElement 
    public class DataIntegrityValidation { 
    
        private Map<String, String> errorResponse = new HashMap<>(); 
    
        public Map<String, String> getErrorResponse() { 
         return errorResponse; 
        } 
    
        public void setErrorResponse(Map<String, String> errorResponse) { 
         this.errorResponse = errorResponse; 
        } 
    } 
    

次にtoResponseメソッドで、DataIntegrityValidation POJOでマップを折り返してレスポンスオブジェクトに追加します。

{ 
    "errorResponse": { 
    "entry": [ 
     { 
     "key": "saveBook.arg0.description", 
     "value": "size must be between 100 and 2147483647" 
     }, 
     { 
     "key": "saveBook.arg0.published", 
     "value": "must be in the past" 
     }, 
     { 
     "key": "saveBook.arg0.link", 
     "value": "must match \"^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$\"" 
     } 
    ] 
    } 
} 

私はこれと一緒に暮らすことができますが、本当にそれはそれは一般的なエンティティに包まれているにもかかわらず、地図を扱うことができない理由を知りたい:

DataIntegrityValidation dataIntegrityValidation = 
     new DataIntegrityValidation(); 
     dataIntegrityValidation.setErrorResponse(errorResponse); 

    return 
     Response.status(Response.Status.BAD_REQUEST) 
     .entity(dataIntegrityValidation).build(); 

これは、次のJSONを与えます。

すべての応答を歓迎します。

答えて

1

MapとGenericEntityの両方でマーシャリングが失敗したのは、関連付けられたJAXB定義がないためです。そして、@XmlRootElementと注釈を付けられたPOJOでマップをラップすると、それを正しくマーシャリングすることができました。

+0

今、あなたは私にそれを説明しています。乾杯。 – Alex

関連する問題