我正在尝试使用responsebuilder创建一个响应。当我在实体中传递字符串时,它工作正常,但当我传递一些错误类时,它不工作。
这是代码
1) 工作良好
Response.status(400).entity("test").build();
2) 不工作
Response.status(400).entity(new MyCustomExceptions(400,"My bad request")).build();
用上面的代码我得到错误
org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=text/plain
当我用上面的代码调用这个服务时,我得到的错误是500,而不是400。但在第一种情况下,我得到了正确的400。
- 只是想了解如果我将对象传递给实体,那么我需要吗重写类MyCustomExceptions中的某些方法
- 如何从MyCustomExceptions对象创建响应
- 若我将字符串传递给实体,它就可以正常工作。为什么
将异常映射到HTTP错误响应
JAX-RS允许您定义Java异常到HTTP错误响应的直接映射。
通过扩展WebApplicationException
,您可以创建特定于应用程序的异常,这些异常使用状态代码和作为响应主体的可选消息来构建HTTP响应。
考虑到这一点,您可以抛出一个扩展WebApplicationException
的BadRequestException
,而不是返回一个Response
,并将其映射到一个状态代码为400
:的HTTP响应
throw new BadRequestException("My bad request");
有关JAX-RS中错误处理的更多详细信息,请参阅以下答案。
WebApplicationException
的子类
为了方便起见,WebApplicationException
目前由以下异常扩展(可以扩展它们来创建自己的异常):
RedirectionException
:重定向错误的3xx
状态代码ClientErrorException
:客户端错误的4xx
状态代码BadRequestException
:400
错误请求ForbiddenException
:403
禁止NotAcceptableException
:406
不可接受NotAllowedException
:不允许使用405
方法NotAuthorizedException
:401
未经授权NotFoundException
:未找到404
NotSupportedException
:415
不支持的媒体类型
ServerErrorException
:5xx
服务器错误的状态代码InternalServerErrorException
:500
内部服务器错误ServiceUnavailableException
:503
服务不可用
您正在传递的HTTPHeader中accept
参数的值是多少?看起来像是text/plain
,而您正试图返回一个Object。
- 在请求中将
accept
值作为application/json
传递。或 -
更改代码以将类型添加为
Json/XML
Response.status(400).type(MediaType.APPLICATION_JSON).entity(new MyCustomExceptions(400,"My bad request")).build();