我有一个REST端点,看起来像这样:
@Path("/api/v1/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class UsersResource {
@GET
public Uni<ListUsersResponse> list(@BeanParam @Valid ListUsersRequest req) {
...
}
}
...
public class ListUsersRequest {
@NotNull
@NotEmpty
@QueryParam("status_in")
List<UserStatus> statusIn;
}
...
public enum UserStatus {
All,
Creating,
Deleting,
...
}
当我像这样调用一个API时:
http://localhost:8080/api/v1/users?status_in=invalid_status
Quarkus/RESTEasy将返回404,服务器日志中甚至不会显示任何内容,因为它是404,因为它是“客户端错误”。
如果我启用调试日志记录,错误如下所示:
java.lang.IllegalArgumentException: No enum constant com.myproject.UserStatus.something
我不喜欢这种行为,因为:
- 404意味着“未找到”,这会让用户认为他们使用的路径根本不存在,这是令人困惑的。
1.用户和开发人员都很难找出问题所在,因为在没有启用DEBUG的情况下,响应或服务器日志中没有错误消息。
显然,这是故意的,因为它符合some spec:
3.2字段和Bean属性
如果字段或属性使用@MatrixParam、@QueryParam或@PathParam注解,则实现必须生成一个NotFoundException(404 status)示例,该示例 Package 抛出的异常,而不包含实体
所以我的问题是,我如何修改它来实际给予有用的错误消息和状态代码?
4条答案
按热度按时间68de4m5k1#
正是出于这个原因,我创建了各种异常处理程序。例如,我想检查传入的JSON主体是否格式错误。为此我做了:
在您的例子中,您应该能够为
IllegalArgumentException
创建一个ExceptionMapper
并执行您想要的操作。我在Wildfly和Quarkus中都运行了这个。ghhaqwfi2#
您可以使用
ParamConverter
作为通用枚举类型。7qhs6swi3#
有一个类似的问题,我给了一个答案。基本上,我建议使用
ResponseEntity
类作为返回值,或者创建标记为@ControllerAdvice
的异常处理程序。请看这里的答案:如何将消息添加到异常响应ffvjumwh4#
这是由QueryParamInjector引起的。如果在Map查询参数时,它捕获了任何不是从
javax.ws.rs.WebApplicationException
继承的异常,它将把异常 Package 到NotFoundException
中。(参见StringParameterInjector#extractValue(String)
和QueryParamInjector#throwProcessingException(String, Throwable)
)您可以通过抛出扩展
javax.ws.rs.WebApplicationException
而不是IllegalArgumentException
的异常来绕过此行为。在我的例子中,我使用自定义的ParamConverter,我将caughtRuntimeException
s Package 成javax.ws.rs.BadRequestException
。另外,
BadRequestException
的自定义ExceptionMapper
也会很有用,因为默认情况下会将stacktrace打印到响应中