ダニエルが言ったように、これにはJSFバリデーターを使用できます。簡単な例:
人がいると仮定します。
public class Person
{
// Just imagine getters and setters ;-)
private String firstName, lastName;
}
そして、非常に単純なバッキングBean:
@ManagedBean
@ViewScoped
public class PersonBean
{
private List<Person> persons = new ArrayList<Person>();
@PostConstruct
private void init()
{
persons.add(new Person("John", "Doe"));
}
}
たとえば、名が大文字で始まるようにします。姓が大文字で始まっていなくてもかまいません(IEまたはレガシーデータベースとの互換性のため、通常の奇妙な点です)。
@FacesValidator("firstNameValidator")
public class FirstNameValidator implements javax.faces.validator.Validator
{
@Override
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException
{
if (!Character.isUpperCase(String.valueOf(value).charAt(0)))
{
FacesMessage msg = new FacesMessage("First name should start with a capital.");
throw new ValidatorException(msg);
}
}
}
すべてをうまく表示するために:
<p:growl id="growl" />
<h:form>
<p:dataTable value="#{bean.persons}" var="person" editable="true">
<p:ajax event="rowEdit" update=":growl"/>
<p:column headerText="first name">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{person.firstName}" />
</f:facet>
<f:facet name="input">
<p:inputText validator="firstNameValidator"
value="#{person.firstName}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="last name">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{person.lastName}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{person.lastName}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<p:rowEditor />
</p:column>
</p:dataTable>
</h:form>
興味がある場合は、Bean Validation(JSR-303)を使用して、ドメインレベルで検証を構成できます。JSFに依存せず、JPAと統合されるため、強くお勧めします。
Bean Validationを使用して、約束どおりに更新します。
まず、バリデーター:
public class FirstNameValidator implements ConstraintValidator<FirstUpper, String>
{
@Override
public void initialize(FirstUpper constraintAnnotation) { }
@Override
public boolean isValid(String value, ConstraintValidatorContext context)
{
return Character.isUpperCase(value.charAt(0));
}
}
使用する注釈:
@Constraint(validatedBy = FirstNameValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface FirstUpper
{
String message() default "{FirstUpper.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
宣言したメッセージは"{FirstUpper.message}"
リソースバンドルに解決されることに注意してください。バンドルは、という名前のクラスパスのルートにある必要があります ValidationMessages.properties
。ローカライズするには、ロケールコードを追加できますValidationMessages_en.properties
。
そのファイルで次のメッセージを宣言します。
FirstUpper.message=First name should start with a capital.
人のクラス:
public class Person
{
@FirstUpper
private String firstName;
private String lastName;
// Imagine the getters/setters again ;-)
}
そして今、あなたのUIでバリデーターを参照する必要はありません、JSFはJSR-303を使用して検証するのに十分賢いです。したがって、これの代わりに:
<p:inputText validator="firstNameValidator" value="#{person.firstName}" />
これを使用してください:
<p:inputText value="#{person.firstName}" />
簡単ですよね?;-)