繁体   English   中英

JaxRS 将 java.lang.Long 验证为 @QueryParam

[英]JaxRS validate java.lang.Long as @QueryParam

我有一个像这样的 JaxRS API:

@GET
@Path("list") 
public Response list(@QueryParam("id") Long id) {
...
}

将非数字参数作为 id 发送时如何处理异常?
实际上我在 JakartaEE 框架上找不到任何验证注释来处理这个问题。
示例请求:

curl http://localhost:8080/api/list?id=ABCD       

注意:我不会将 Long 更改为 String。

您应该在@QueryParam 之后添加验证注解:

@GET
@Path("list") 
public Response list(@QueryParam("id")
                     @Min(value=0L, message="insert number value") 
                     Long id) {
...
}

最后我抓住了那个例外。

首先:
我尝试用这个注释来处理这个问题:

@Min
@PositiveOrZero
@Pattern(regexp = "\\[0-9]+") or @Pattern(regexp = "\\d+")
@Digits
... 

它们都不起作用,因为必须首先将该字符串转换为数字然后进行验证。 所以 JaxRs 不能那样做!
我使用了这个解决方案:

@Provider
public class NumberExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public Response toResponse(Exception exception) {
        Exception numberFormatException = getNumberFormatException(exception);
        if (numberFormatException != null) {
            return Response.status(Response.Status.BAD_REQUEST).entity("Invalid Parameter").build();
        } else {
            return Response.status(Response.Status.BAD_REQUEST).entity(exception.getMessage()).build();
        }
    }

    private Exception getNumberFormatException(Exception e) {
        if (e instanceof NumberFormatException nfe) return nfe;
        return getNumberFormatException((Exception) e.getCause());
    }
}  

工作没有任何问题。
谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM