我希望能够让客户通过HTTP内容协商选择错误响应格式。
例如,给定一个端点
@Produces("application/json")
class MyService {
@GET
public String getSomething() {
if (currentTimeMilis() % 2 == 0) throw new MyException();
return "{ hello:\"world\" }";
}
和异常映射器:
class MyExceptionMapper implements ExceptionMapper<MyException> {
@Override
public Response toResponse(MyException ex) {
return status(BAD_REQUEST)
.entity(new MyDto(randomUUID(), ex.getMessage()))
.build();
}
}
现在有两个body writer,分别是MyBodyWriter
和标准的JacksonJsonProvider
。
我希望根据Accept头的内容来调用其中一个writer,例如:
Accept: application/json
-> 调用JacksonJsonProvider
Accept: application/vnd-mycompany-error, application/json
-> 调用MyBodyWriter
我尝试了不同的方法,但它们都失败了,因为匹配的HttpRule
暗示了一个application/json
的content type。
我唯一找到的解决方法是将请求头注入到ExceptionMapper
中,并在那里显式地设置content type -- 但我不喜欢这种方法。