Java Bean Validation (JSR303) restrições envolvendo relação entre várias propriedades de feijão

StackOverflow https://stackoverflow.com/questions/1700295

Pergunta

Say Eu tenho o seguinte feijão java simples:

class MyBean {
   private Date startDate;
   private Date endDate;
   //setter, getters etc...
}

Existe um mecanismo no JSR 303 para criar um validador personalizado que valida a restrição de que startDate deve ser antes endDate?

Parece-me ser um caso de uso comum, mas não consigo encontrar qualquer exemplos deste tipo de múltiplos restrição propriedade relationsship.

Foi útil?

Solução

Eu posso pensar em algumas coisas para experimentar.

Você pode criar um Constraint com um alvo do próprio tipo com um validador apropriado:

@ValidateDateRange(start="startDate", end="endDate")
public class MyBean {

Você pode encapsular um intervalo de datas em um tipo e validar que:

public class DateRange {    
  private long start;
  private long end;

  public void setStart(Date start) {
    this.start = start.getTime();
  }

  // etc.

Você pode adicionar uma propriedade simples que realiza a verificação:

public class MyBean {
  private Date startDate;
  private Date endDate;

  @AssertTrue public boolean isValidRange() {
    // TODO: null checks
    return endDate.compareTo(startDate) >= 0;
  }

Outras dicas

Se você estiver usando Hibernate Validator na versão 4.1 ou mais tarde você pode usar o @ScriptAssert restrição em conjunto com um script ou expressão da linguagem para expressar esse tipo de restrição. Usando JavaScript seu exemplo ficaria assim:

 @ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)")
 public class CalendarEvent {

      private Date startDate;

      private Date endDate;

      //...
 } 

Você pode obter uma sintaxe ainda mais compacto por criar uma restrição personalizada para a linguagem de script de sua escolha:

@JexlAssert("_.startDate < _.endDate")
public class CalendarEvent {

    private Date startDate;

    private Date endDate;

    //...
}

A resposta é um validador nível de classe. Você pode definir restrições personalizadas que você pode colocar em classe de entidade. No tempo de validação que você passou toda a instância para o método isValid (). Você pode então comparar suas duas datas uns contra os outros. Veja também o Hibernate Validator documentação .

Uma vez que não há nenhuma maneira para acessar o feijão em um validador JSR 303, isso não é possível.

Uma solução alternativa seria a de fornecer o seu próprio ConstraintValidatorContext e estendê-lo com uma referência para o bean que você está validando atualmente. Mas eu não tenho certeza se você pode modificar / substituir a respectiva fábrica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top