@Digits 检查成功后立即在 Hibernate-Validator 中将 String 解析为 Integer
Parse String immediately to Integer in Hibernate-Validator after successful @Digits check
我在 Quarkus 中有一个 JAX-RS 资源,我想验证其输入。下面这个验证 bean 中的一个属性将验证来自 PUT 方法的输入,它包含一个 属性,它应该是一个数字。
public class UpdateBookDTO {
public Optional<@Length(min = 2, max = 100) String> title;
public Optional<@Length(min = 2, max = 100) String> author;
public Optional<@Positive @Digits(fraction = 0, integer = 10) String> pages;
@Override
public String toString() {
return "UpdateBookDTO{" +
"title=" + title +
", author=" + author +
", pages=" + pages +
'}';
}
}
但是,由于@Digits 注释不适用于 Integer 数据类型,我必须使用 String。这个问题当然是它需要一个额外的解析步骤。我能否以及如何使用一些“神奇的”注释直接在验证 bean 中执行此操作,或者这不可能吗?
提前致谢!
评论中描述了我寻求的解决方案。我创建了一个名为“exceptions”的新包,其中包含全局处理程序以捕获在尝试执行我描述的操作时生成的异常问题。基本处理程序最终看起来像这样:
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ProcessingException;
@Provider
public class CustomExceptionHandler implements ExceptionMapper<ProcessingException> {
@Override
public Response toResponse(ProcessingException e) {
e.printStackTrace();
return Response.status(400).entity("Unsupported data type").build();
}
}
实际基于上述代码构建的实现有点复杂 - 逻辑还会解析哪个字段有问题,还会告诉您它是否位于嵌套 class 中 - 但这是如何实现的它将按照基本原则进行。它应该开箱即用,无需任何其他配置,只要您有 @Provider 装饰器。
我在 Quarkus 中有一个 JAX-RS 资源,我想验证其输入。下面这个验证 bean 中的一个属性将验证来自 PUT 方法的输入,它包含一个 属性,它应该是一个数字。
public class UpdateBookDTO {
public Optional<@Length(min = 2, max = 100) String> title;
public Optional<@Length(min = 2, max = 100) String> author;
public Optional<@Positive @Digits(fraction = 0, integer = 10) String> pages;
@Override
public String toString() {
return "UpdateBookDTO{" +
"title=" + title +
", author=" + author +
", pages=" + pages +
'}';
}
}
但是,由于@Digits 注释不适用于 Integer 数据类型,我必须使用 String。这个问题当然是它需要一个额外的解析步骤。我能否以及如何使用一些“神奇的”注释直接在验证 bean 中执行此操作,或者这不可能吗?
提前致谢!
评论中描述了我寻求的解决方案。我创建了一个名为“exceptions”的新包,其中包含全局处理程序以捕获在尝试执行我描述的操作时生成的异常问题。基本处理程序最终看起来像这样:
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ProcessingException;
@Provider
public class CustomExceptionHandler implements ExceptionMapper<ProcessingException> {
@Override
public Response toResponse(ProcessingException e) {
e.printStackTrace();
return Response.status(400).entity("Unsupported data type").build();
}
}
实际基于上述代码构建的实现有点复杂 - 逻辑还会解析哪个字段有问题,还会告诉您它是否位于嵌套 class 中 - 但这是如何实现的它将按照基本原则进行。它应该开箱即用,无需任何其他配置,只要您有 @Provider 装饰器。