0

제 신청서에 약간의 문제가 있습니다. 필드 암호와 암호가 일치하는지 확인하고 싶습니다. 그래서이 질문에 대한 첫 번째 대답에서와 같이 시도했습니다. Cross field validation with Hibernate Validator (JSR 303)크로스 필드 콩 유효성 검사 - 왜 작동하지 않습니까?

문제는 실제로 작동하지 않으며 IDEA가 없습니다. 왜. 도와주세요! 이것은 여기에 내 첫 게시물, 그래서 제발 나를 위해 가혹한하지 마십시오. JSF

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package pl.lodz.p.zsk.ssbd2012.ssbd12.Beans; 

import javax.ejb.EJB; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import javax.validation.constraints.Pattern; 
import javax.validation.constraints.Size; 
import pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.CheckEmail; 
import pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch; 
import pl.lodz.p.zsk.ssbd2012.ssbd12.entities.Account; 
import pl.lodz.p.zsk.ssbd2012.ssbd12.mok.endpoint.MokEndpointLocal; 

/** 
* 
* @author krzys 
* @author lukasz 
*/ 

@ManagedBean 
@RequestScoped 
@FieldMatch(first = "password", second = "password2", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch}") 
public class RegisterBean { 

    /** 
    * Creates a new instance of RegisterBean 
    */ 

    @EJB 
    MokEndpointLocal endpoint; 

    @Size(min = 3, max = 16, message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.login.size}") 
    @Pattern(regexp = "[a-zA-Z0-9]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.login.invalid}") 
    private String login; 

    @Size(min = 6, max = 64, message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.password.size}") 
    @Pattern(regexp = "[a-zA-Z0-9]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.password.invalid}") 
    private String password; 

    private String password2; 

    @Pattern(regexp = "[A-Ż][a-ż]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.name.invalid}") 
    private String name; 

    @Pattern(regexp = "[A-Ż][a-ż]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.surname.invalid}") 
    private String surname; 

    @CheckEmail 
    private String email = ""; 


    /** 
    * @return the login 
    */ 
    public String getLogin() { 
     return login; 
    } 

    /** 
    * @param login the login to set 
    */ 
    public void setLogin(String login) { 
     this.login = login; 
    } 

    /** 
    * @return the password 
    */ 
    public String getPassword() { 
     return password; 
    } 

    /** 
    * @param password the password to set 
    */ 
    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getPassword2() { 
     return password2; 
    } 

    public void setPassword2(String password2) { 
     this.password2 = password2; 
    } 

    /** 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String register() 
    { 
//  Account account = new Account(); 
//  account.setLogin(login); 
//  account.setHaslo(password); 
//  account.setImie(name); 
//  account.setNazwisko(surname); 
//  account.setEmail(email); 
//  endpoint.register(account); 
     return "registerSucces"; 
    } 

    /** 
    * @return the surname 
    */ 
    public String getSurname() { 
     return surname; 
    } 

    /** 
    * @param surname the surname to set 
    */ 
    public void setSurname(String surname) { 
     this.surname = surname; 
    } 
} 

그리고 여기 :

여기
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints; 

import java.lang.annotation.*; 
import javax.validation.Constraint; 
import javax.validation.Payload; 

/** 
* 
* @author lukasz 
*/ 
@Documented 
@Constraint(validatedBy = FieldMatchValidator.class) 
@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface FieldMatch { 

String message() default "{pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch}"; 

Class<?>[] groups() default {}; 

Class<? extends Payload>[] payload() default {}; 

String first(); 

String second(); 
} 

내 ValidatorClass입니다 :

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints; 

import java.lang.reflect.InvocationTargetException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 
import org.apache.commons.beanutils.BeanUtils; 

/** 
* 
* @author lukasz 
*/ 
public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> { 

    private String firstFieldName; 
    private String secondFieldName; 

    @Override 
    public void initialize(FieldMatch constraintAnnotation) { 
     firstFieldName = constraintAnnotation.first(); 
     secondFieldName = constraintAnnotation.second(); 
    } 

    @Override 
    public boolean isValid(Object value, ConstraintValidatorContext context) { 
     try { 
      String sFirstField = BeanUtils.getProperty(value, firstFieldName); 
      String sSecondField = BeanUtils.getProperty(value, secondFieldName); 
      if(sFirstField.equals(sSecondField)){ 
       return true; 
      } 
     } catch (IllegalAccessException ex) { 
      Logger.getLogger(FieldMatchValidator.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InvocationTargetException ex) { 
     Logger.getLogger(FieldMatchValidator.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (NoSuchMethodException ex) { 
     Logger.getLogger(FieldMatchValidator.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return false; 
    } 
} 

그리고 여기 내 빈의 다음

내 주석의

<?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://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <h:outputStylesheet name="menu.css" library="css" /> 
    <title>#{messages.registration}</title> 
</h:head> 

<h:body> 
    <ui:composition template="./../resources/mainTemplate.xhtml"> 

     <h4>#{messages.registration}</h4> 
    <ui:define name="content"> 
     <h4>#{messages.registration}</h4> 
     <h1>#{messages.registrationInfo1}</h1> 
    #{messages.registrationInfo2} 
    <h:form> 
     <h2> 
      <h:outputText value="#{messages.loginForm}"/> 
      <h:inputText id="login" value="#{registerBean.login}" /> 
     </h2> 
     <h2> 
      <h:outputText value="#{messages.passwordForm}" /> 
      <h:inputSecret id="password" value="#{registerBean.password}" /> 
     </h2> 
     <h2> 
      <h:outputText value="#{messages.repeatPasswordForm}"/> 
      <h:inputSecret id="confirm" value="#{registerBean.password2}" /> 
     </h2> 
     <h2> 
      <h:outputText value="#{messages.nameForm}"/> 
      <h:inputText id="name" value="#{registerBean.name}" /> 
     </h2> 
     <h2> 
      <h:outputText value="#{messages.surnameForm}"/> 
      <h:inputText id="surname" value="#{registerBean.surname}" /> 
     </h2> 
     <h2> 
      <h:outputText value="#{messages.emailForm}"/> 
      <h:inputText id="email" value="#{registerBean.email}" /> 
     </h2> 
     <h2>  
      <h:commandButton value="#{messages.send}" action="#{registerBean.register()}" /> 
     </h2> 
    </h:form> 
    </ui:define> 
    </ui:composition> 
</h:body> 
</html> 
,
+0

를? Bean에 대한 유효성 검증을 실행하려면'Validator'를 작성하고'validate()'메소드를 호출하여 객체를 전달해야합니다. 당신의 프레임 워크가 그것을하지 않는다면, 당신 스스로 그것을해야합니다. –

+0

잘 모르겠지만 주석만으로도 충분하다는 것을 알았습니다. Pattern이나 CheckEmail 같은 다른 주석을 만들었습니다. 틀 렸으면 고쳐줘. – AjMeen

답변

4

유효성 검사 단계에서 클래스 수준 제약 조건이 JSF에 의해 자동으로 트리거되지 않습니다. 필드 레벨 제약 조건 만 사용할 수 있습니다 (또한 모든 필드가 JSF로 평가되는 것은 아니며 Facelet에있는 필드 만 평가됩니다).

당신은 당신이 수동으로 유효성 검사를 수행 할 수있는 콩 유효성 검사를 사용하려면 : (하지만 난 그것을 시도 적이)

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<Test>> violations = validator.validate(this, Default.class); 

당신은 당신의 빈의 등록 방법이나 업데이트 모델 단계 이후 그것을 할 수 있습니다.

어쨌든 대신 콩 검증의 JSF 유효성 검사를 사용하거나 등록 방법에 직접 암호를 확인합니다 유효성 검사를 트리거해야 귀하의 경우에는

public String registration() { 
    ... 

    if (!password.equals(password2)) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Passwords do not match")); 
     return null; 
    } 

    ... 
} 
+0

그래, 지금은 어떤 이유인지 알지만 문제를 해결하는 방법은 아직도 모른다. 당신의 충고가 너무 광범위합니다. 예를 들어 주셔서 감사합니다. 정확히 무엇을해야하는지 모르겠습니다. JSF 코드에서 몇 가지 변경 사항을 수행해야합니까? 당신은 Validator 클래스를 생성하고 validate()를 호출해야한다고 했지요. 그래서 FieldMatch와 FieldMatchValidator를 가지고 뭐죠? 그들은 더 이상 필요하지 않습니까? 그리고 Validator 클래스의 validate() 메서드는 어떻게 호출해야합니까? – AjMeen

+0

@ user1591434 내 업데이트를 참조하십시오. 빈 유효성 검사는 Java의 모든 곳에서 사용할 수있는 일반적인 유효성 검사 시스템입니다. JSF에는 수동 업데이트와 같은 상용구 코드를 피할 수있는 몇 가지 기능이 있습니다. 그러나 이러한 시설은 현장 수준의 유효성 검사에만 국한됩니다. 클래스 수준 유효성 검사를 원할 경우 수동으로 수행해야합니다. – Alf