- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个简单的 validator 来验证一个字符串值是预定义列表的一部分:
public class CoBoundedStringConstraints implements ConstraintValidator<CoBoundedString, String>
{
private List<String> m_boundedTo;
@Override
public void initialize(CoBoundedString annotation)
{
m_boundedTo = FunctorUtils.transform(annotation.value(), new ToLowerCase());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context)
{
if (value == null )
{
return true;
}
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("should be one of " + m_boundedTo).addConstraintViolation();
return m_boundedTo.contains(value.toLowerCase());
}
}
例如它将验证:
@CoBoundedString({"a","b" })
public String operations;
我想为字符串列表创建一个 validator 来验证这样的东西:
@CoBoundedString({"a","b" })
public List<String> operations = new ArrayList<String>();
我试过这个:
public class CoBoundedStringListConstraints implements ConstraintValidator<CoBoundedString, List<String>>
{
private CoBoundedString m_annotation;
@Override
public void initialize(CoBoundedString annotation)
{
m_annotation = annotation;
}
@Override
public boolean isValid(List<String> value, ConstraintValidatorContext context)
{
if (value == null )
{
return true;
}
CoBoundedStringConstraints constraints = new CoBoundedStringConstraints();
constraints.initialize(m_annotation);
for (String string : value)
{
if (!constraints.isValid(string, context))
{
return false;
}
}
return true;
}
}
问题是,如果列表包含 2 个或更多非法值,则只有一个(第一个)违反约束。我希望它有多个。我应该怎么做?
最佳答案
您当前的代码有两个问题:
在您的 CoBoundedStringListConstraints
的 isValid
方法中,您应该像这样迭代给定列表的所有元素(适当设置一个 allValid
标志) :
@Override
public boolean isValid(List<String> value,
ConstraintValidatorContext context) {
if (value == null) {
return true;
}
boolean allValid = true;
CoBoundedStringConstraints constraints = new CoBoundedStringConstraints();
constraints.initialize(m_annotation);
for (String string : value) {
if (!constraints.isValid(string, context)) {
allValid = false;
}
}
return allValid;
}
第二个是equals
的实现,用于违反约束(javax.validation.Validator.validate()
返回一个集合!) .当您始终输入相同的消息时(应该是 [a, b] 之一
),该集合仍将仅包含 1 个元素。作为一种解决方案,您可以将当前值添加到消息中(class CoBoundedStringConstraints
):
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
if (!m_boundedTo.contains(value)) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(
value + " should be one of " + m_boundedTo)
.addConstraintViolation();
return false;
}
return true;
}
关于java - 如何为 List 创建一个 ConstraintValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865209/
我在我的项目中使用 bean-validation,我想为现有的约束注释编写一个自定义验证器。 例如,我有一个表示名为 CustomDateTime 的日期/时间的类。 .在使用此类作为例如出生日期的
您能告诉我如何创建也适用于单个字段和集合的自定义约束 validator 吗? 例如,我有一个对象 Foo,其中包含状态枚举 public class Foo { Status status;
假设我有一个自定义 ConstraintValidator: public class FooValidator implements ConstraintValidator { @Overr
我已经阅读了一些关于如何使用 Hibernate 的 ConstrainValidator 的问答和指南(例如 Hibernate Documentation ),但没有一个明确提及如何在 a 的特定
如果您熟悉 Bean 验证框架,您就会知道无法获取方法参数的名称。因此,如果您对方法的第一个参数执行 @NotNull 约束并且验证失败,则 getPropertyPath 将类似于“arg1”。 我
我已经在测试中模拟了 EntityManager。 但现在我也需要在我的真实类中模拟 EntityManager(自定义约束注释的 validator )。 在测试中我这样做 @RunWith(Moc
是否可以在嵌套到 @interface 定义的 ConstraintValidator 中使用依赖注入(inject)? 我创建了需要验证一些数据的自定义注释。 CodebookValidator 只
由于应用程序的架构,我需要将约束注释与其实现分离。当未显式设置 validatedBy 属性时,我正在考虑使用 @Size 注释中使用的方法: @Target({ METHOD, FIELD, ANN
了解后Hibernate Custom Validators ,它让我对一个主题产生了兴趣,我是否可以创建一个基本注释,我可以在其中设置要使用的 validator ? @Target({ Eleme
现在我正在开发我的 spring+hibernate 应用程序。 我想覆盖 @Min 注释的 validator 并编写以下代码: @Component public class CustomMinV
我有一个简单的 validator 来验证一个字符串值是预定义列表的一部分: public class CoBoundedStringConstraints implements Constraint
在 ConstraintValidator 中使用依赖注入(inject)时,我遇到了意外的行为。正在类里面进行评估。 实体类: @Entity @ValidDemoEntity public cla
任何人都可以解释一下为什么 ConstraintValidator 类的 isValid() 方法被调用两次吗? 例如,这是我的示例代码: @POST @Path("/json/dog") @Prod
我有一些 UserService 对 User 实体进行操作。我创建了自己的注释和 ConstraintValidator 类作为实现 我需要将该 UserService 注入(inject)到 Co
我正在开发一项增强功能,以创建新的表 A 并将其 id 引用为现有表 B 中的新列 为了简洁起见,我省略了整个实体类。 import javax.validation.constraints.NotN
任何人都可以解释一下为什么 ConstraintValidator 类的 isValid() 方法被调用两次吗? 例如,这是我的示例代码: @POST @Path("/json/dog") @Prod
我需要创建一个自定义注释,当该注释应用于方法时,会根据各种检查检查并验证输入参数(原始和非原始)。如果检查失败应该直接返回错误消息。 在搜索时,我在创建自定义注释时遇到了 AbstractProces
我创建了一个 API 并添加了一个自定义注释来验证请求正文对象,但这从未被调用。下面是对象。请检查一下代码并帮我看看代码哪里需要更正? @NotNull,@Size 也不起作用 请求正文对象 @Get
场景是在持久化一个Log实体类之前,应该检查它的属性String description是否至少包含一个在IllegalWord中找到的词 实体类。下面是两个实体类的映射: // Log.java @
有没有办法从 ConstraintValidator.isValid 方法访问叶或根 bean?如果没有,有什么解决方法吗? 谢谢。 马科斯 最佳答案 不,没有,原因是调用Validator#vali
我是一名优秀的程序员,十分优秀!