java - javax.validation.Validator 排除一些字段
问题描述
我有两个不同的服务:第一个是将对象保存到数据库,第二个是更新现有对象。
我正在为我的对象使用验证约束,例如(@NotBlank、@Size、@Pattern 等),在第一种情况下,我需要验证对象的所有字段,但在后一种情况下,需要排除某些字段验证器。
目前,我正在使用 javax.validation.Validator 进行验证。这是我的对象...
public class Person {
private Long id;
@NotBlank
@Size(max = 45)
private String name;
@Size(max = 5000)
private String description;
@Size(max = 300)
private String address;
}
...而且我想在更新验证期间排除“地址”字段。
@Named
@RequiredArgsConstructor
@Service
@Slf4j
public class PersonService {
private final PersonRepository repository;
private final Validator validator = buildDefaultValidatorFactory().getValidator();
public Person save(Person person) {
Set<ConstraintViolation<Person>> violations = validator.validate(person);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(new HashSet<>(violations));
}
return repository.save(person);
}
public Person update(Person person) {
Set<ConstraintViolation<Person>> violations = validator.validate(person); //exclude address field here
if (!violations.isEmpty()) {
throw new ConstraintViolationException(new HashSet<>(violations));
}
return repository.save(person);
}
}
解决方案
如果您需要排除地址属性,只需在验证之前将其设置为 null。并在验证后将其设置为之前的值:
public Person update(Person person) {
String address = person.getAddress();
person.setAddress(null);
Set<ConstraintViolation<JobAd>> violations = validator.validate(person);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(new HashSet<>(violations));
}
person.setAddress(address)
return repository.save(person);
}
推荐阅读
- sql-server - 无法从 SQL Server 代理运行 SQL Server SSIS 包
- listview - Flutter 小部件动态地放在其余部件之上
- node.js - react-native node 依赖安装破坏项目
- r - 将字符串转换为数字时出错
- html - Powershell 服务状态 || HTML 输出
- xcode - 为什么 Xcode 10 会崩溃?
- android - 在 NDK for Android 上编译 stressapptest
- vba - VBA - 将数据从一个工作簿推送到另一个工作簿,而不考虑文件名
- githooks - gitolite 设置解决了什么问题?
- c# - 计算组中列的变化并根据标准进行提取