我想创建List
的自定义验证程序,以确保至少选择了两个项目。问题是,initialize
和isValid
方法都没有被调用过。如何使列表验证器工作?
我使用的是Java EE 7。
package com.sample.listvalidation;
import org.apache.commons.lang3.tuple.MutablePair;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
@ViewScoped
@Named
public class Bean implements Serializable {
@AtLeast2Selected
private List<MutablePair<String, Boolean>> selection;
public List<MutablePair<String, Boolean>> getSelection() {
return selection;
}
public void setSelection(List<MutablePair<String, Boolean>> selection) {
this.selection = selection;
}
@PostConstruct
void init() {
selection = Arrays.asList(
MutablePair.of("a", true),
MutablePair.of("b", true),
MutablePair.of("c", false),
MutablePair.of("d", false)
);
}
public String validate() {
return null;
}
}
package com.sample.listvalidation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Constraint(validatedBy = AtLeast2SelectedValidator.class)
public @interface AtLeast2Selected {
String message() default "At leaset 2 items have to be selected.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
package com.sample.listvalidation;
import org.apache.commons.lang3.tuple.MutablePair;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.List;
public class AtLeast2SelectedValidator implements ConstraintValidator<AtLeast2Selected, List> {
@Override
public void initialize(AtLeast2Selected constraintAnnotation) {
System.out.println("AtLeast2SelectedValidator.initialize");
}
@Override
public boolean isValid(List value, ConstraintValidatorContext context) {
System.out.println("AtLeast2SelectedValidator.isValid");
if (value == null) {
return false;
}
@SuppressWarnings("unchecked")
final List<MutablePair<String, Boolean>> typedValue = (List<MutablePair<String, Boolean>>) value;
return typedValue.stream()
.filter(MutablePair::getRight)
.count() >= 2;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<f:view>
<h:messages />
<h:form>
<h:dataTable value="#{bean.selection}" var="row">
<h:column>
<h:selectBooleanCheckbox value="#{row.right}" id="checkbox" />
</h:column>
<h:column>
<h:outputLabel for="checkbox" value="#{row.left}" />
</h:column>
</h:dataTable>
<h:commandButton value="validate" action="#{bean.validate}" />
</h:form>
</f:view>
</html>