我需要检查我的应用程序中某个字段的唯一性。
我尝试使用 Hibernate@Unique
约束,但它显示堆栈跟踪,但用户表单中没有错误消息。
我的下一个解决方案是编写一个自定义验证器,但我认为有更好的解决方案。
在 JSF 中有没有更简单的方法来做到这一点?
(JSF 2.1 + RichFaces)
我需要检查我的应用程序中某个字段的唯一性。
我尝试使用 Hibernate@Unique
约束,但它显示堆栈跟踪,但用户表单中没有错误消息。
我的下一个解决方案是编写一个自定义验证器,但我认为有更好的解决方案。
在 JSF 中有没有更简单的方法来做到这一点?
(JSF 2.1 + RichFaces)
我为我的基本实体的 JSF 2.1 唯一密钥验证破解了一个快速而肮脏的工作解决方案:
用法:
<p:inputText id="name" value="#{employeesController.currentEmployee.name}">
<f:validator validatorId="uniqueColumnValidator" />
<f:attribute name="currentEntity" value="#{employeesController.currentEmployee}" />
<f:attribute name="uniqueColumn" value="name" />
</p:inputText>
验证器:
@RequestScoped
@FacesValidator("uniqueColumnValidator")
public class UniqueColumnValidator implements Validator, Serializable {
@PersistenceContext
protected EntityManager em;
/**
* generic unique constraint validator for AbstractBaseEntity entities<br />
* requires the following additional attributes on the form element ("<f:attribute>"):<br />
* - "currentEntity" the entity instance (used for getting the class and guid)<br />
* - "uniqueColumn" the column where the new value will be checked for uniqueness
*/
@Override
public void validate(final FacesContext context, final UIComponent comp, final Object newValue) throws ValidatorException {
AbstractBaseEntity currentEntity = (AbstractBaseEntity) comp.getAttributes().get("currentEntity");
String uniqueColumn = (String) comp.getAttributes().get("uniqueColumn");
boolean isValid = false;
try {
em.createQuery(
"FROM " + currentEntity.getClass().getSimpleName()
+ " WHERE " + uniqueColumn + " = :value"
+ " AND guid <> :guid", currentEntity.getClass())
.setParameter("value", value)
.setParameter("guid", currentEntity.getGuid())
.getSingleResult();
} catch (NoResultException ex) {
isValid = true; // good! no result means unique validation was OK!
}
if (!isValid) {
FacesMessage msg = Messages.createError("must be unique", uniqueColumn);
context.addMessage(comp.getClientId(context), msg);
throw new ValidatorException(msg);
}
}
}
您可以在支持 bean 上使用<f:ajax />
oronblur
事件textfield
并在您的支持 bean 中验证所有model
不是的值null
。
<h:message id="errorMessageTag" for="fieldId"/>
<h:inputText id="fieldId" value="#{beanName.modelName.variableName}">
<f:ajax event="blur" listener="#{beanName.property}" render="errorMessageTag" />
</h:inputText>
您可以手动验证您的 bean 一个 ajax 请求。下面给出了手动验证的示例。
ClassValidator<TestClass> classValidator = new ClassValidator<TestClass>(
TestClass.class );
InvalidValue[] invalidValues = classValidator
.getInvalidValues(testObject);
for (InvalidValue invalidValue : invalidValues) {
System. out .println( "Property Name: "
+ invalidValue.getPropertyName() + " Message: "
+ invalidValue.getMessage());
}
<a4j:support />
您可以使用标记捕获 ajax 请求