2014-10-07 34 views
3

我遵循Primefaces 5.1指南,我能夠使用Bean驗證(JSR 349)進行客戶端網站驗證(CSV)。我有如何在Primefaces客戶端網站驗證(CSV)中使用Hibernate驗證器

<context-param> 
    <param-name>primefaces.TRANSFORM_METADATA</param-name> 
    <param-value>true</param-value> 
</context-param> 
<context-param> 
    <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name> 
    <param-value>true</param-value> 
</context-param> 

有了這個設置,標準@Size@Pattern都沒有往返於服務器的工作。但是來自Hibernate Validator的註釋@Email完全不起作用。他們用戶指南在Primefaces介紹第三方註解作爲

當使用像Hibernate驗證特殊註解第三方的約束,使用 BeanValidationMetadataMapper定義ClientValidationConstraint他們。

BeanValidationMetadataMapper.registerConstraintMapping(Class<? extends Annotation> 
constraint, ClientValidationConstraint clientValidationConstraint); 

BeanValidationMetadataMapper.removeConstraintMapping(Class<? extends Annotation> 
constraint); 

這聽起來真是高深莫測的給我。有誰知道這套裝置應該是什麼樣子?謝謝。

回答

0

對於@NotBlank例如:

package com.algaworks.pedidovenda.util; 

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 

import org.hibernate.validator.constraints.NotBlank; 
import org.primefaces.validate.bean.BeanValidationMetadataMapper; 

import com.algaworks.pedidovenda.validation.NotBlankClientValidationConstraint; 

@WebListener 
public class AppContextListener implements ServletContextListener { 

@Override 
public void contextDestroyed(ServletContextEvent event) { 
} 

@Override 
public void contextInitialized(ServletContextEvent event) { 
    System.setProperty("org.apache.el.parser.COERCE_TO_ZERO", "false"); 

    BeanValidationMetadataMapper.registerConstraintMapping(NotBlank.class, 
      new NotBlankClientValidationConstraint()); 
} 

} 

而且ClientValidationConstraint本身:

package com.algaworks.pedidovenda.validation; 

import java.util.HashMap; 
import java.util.Map; 

import javax.validation.metadata.ConstraintDescriptor; 

import org.hibernate.validator.constraints.NotBlank; 
import org.primefaces.validate.bean.ClientValidationConstraint; 

public class NotBlankClientValidationConstraint implements ClientValidationConstraint { 

public static final String MESSAGE_ID = "{org.hibernate.validator.constraints.NotBlank.message}"; 

@SuppressWarnings("rawtypes") 
@Override 
public Map<String, Object> getMetadata(ConstraintDescriptor constraintDescriptor) { 
    Map<String, Object> metadata = new HashMap<String, Object>(); 
    Map attrs = constraintDescriptor.getAttributes(); 

    Object message = attrs.get("message"); 

    if (!message.equals(MESSAGE_ID)) { 
     metadata.put("data-msg-notblank", message); 
    } 

    return metadata; 
} 

@Override 
public String getValidatorId() { 
    return NotBlank.class.getSimpleName(); 
} 

} 

假設代碼的工作,因爲它是從這裏 「借」:

Listener

ClientValidationConstraint

而且不要忘了:

PrimeFaces.validator.NotBlank = { 

MESSAGE_ID : 'org.hibernate.validator.constraints.NotBlank.message', 

validate : function(element, value) { 
    if (value === null || value === undefined || value.trim() === '') { 
     var msg = element.data('msg-notblank'); 
     var label = element.data('p-label'); 
     var context = PrimeFaces.util.ValidationContext; 
     var msgObj; 

     if (!msg) { 
      msgObj = context.getMessage(this.MESSAGE_ID, label); 
     } else { 
      var msgObj = { 
       summary : msg, 
       detail : msg 
      } 
     } 

     throw msgObj; 
    } 
} 

};