2016-05-22 12 views
0

Ich benutze thymeleaf + sprinboot für eine Webanwendung und ich frage mich, wie ich die Validierungsfehler steuern kann, wenn ich Value Objects (VOs) verwende.Thymeleaf JPA Fehler-Validierung mit VO

Wie Sie sehen können, hat das Unternehmen einen Constraint (unique) für ein Attribut:

@Entity 
public class Company { 

    @Id 
    @GeneratedValue 
    Integer id = 0; 
    @Column(unique = true) 
    String code; 
    String name; 
    String address; 
... 
} 

Aber der VO ist nicht beabsichtigt zu haben:

public class CompanyVO { 

    Integer id = 0; 
    String code; 
    String name; 
    String address; 
... 
} 

daher kann der Controller nicht validieren, wenn der Wert wiederholt oder einzigartig:

@RequestMapping(method = RequestMethod.POST) 
public String set(@Valid CompanyVO companyVO, BindingResult result, Model model){ 

    Company company = new Company(); 

    if(result.hasErrors()){ 
     return "company"; 
    } 

    if(companyVO.getId() != 0){ 
     company = companyRepository.findOne(companyVO.getId()); 
    } 

    mapper.map(companyVO, company); 
    companyRepository.save(company); 
    return "redirect:/companies"; 
} 

Wie kann ich die Validierungsfehler auf der Ansicht zeigen wenn ich VO's benutze?

Antwort

2

Sie haben wirklich nur eine Option. Um die Ausnahme von Hibernate/DB über einen doppelten Wert abzufangen und zusätzliche Fehler in BindingResult zu füllen.

Eine Abfrage führt zu einer Wettlaufsituation. Wenn zwei Benutzer ungefähr zur gleichen Zeit versuchen, den gleichen Wert einzugeben, können beide Validierungen bestanden werden (da es in der Datenbank noch keinen Wert gibt) und einer von ihnen wird später fehlschlagen, da nur eine Transaktion erfolgreich sein kann. Wenn Sie die Ausnahme abfangen, können Sie BindingResult.addError mit einer FieldError aufrufen, die den Feldnamen und die Fehlermeldung enthält.