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を与えます。
すべての応答を歓迎します。
今、あなたは私にそれを説明しています。乾杯。 – Alex