2016-06-17 18 views
3

ich ein Unternehmen wie dies bekam:individuelle JPA Validierung im Frühjahr Boot

@Entity 
@Table(name = "transaction_receiver") 
public class TransactionReceiver implements Serializable, Addressable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    @Column(name = "contact_id", nullable = false) 
    private String contactId; 

    @Column(name = "datev_number") 
    private String datevNumber; 

    @NotNull 
    @Column(name = "receiver", nullable = false) 
    private String receiver; 

    @NotNull 
    @Size(min = 22, max = 34) 
    @Column(name = "iban", length = 34, nullable = false) 
    private String iban; 

    @Size(min = 8, max = 11) 
    @Column(name = "bic", length = 11, nullable = false) 
    private String bic; 

    @NotNull 
    @Column(name = "institute") 
    private String institute; 

    @Column(name = "company") 
    private String company; 

und die Aufgabe, eine benutzerdefinierte Validierung „, damit Sie eine leere iban zur Verfügung stellen können, bic und Institut, das ist in Ordnung, aber wenn überhaupt. der Felder ist nicht leer, die oben genannten Constrait müssen halten "

Ich suche nach dem elegantesten Weg, dies zu erreichen.

Meine aktuelle Lösung ist - was ich irgendwie schmutzig denken, aber die Arbeit - eine @PrePersist Anweisung zu verwenden und Ausnahmen werfen von dort

@PrePersist 
    public void checkBankData() { 
     boolean ibanEmpty = iban == null || iban.isEmpty(); 
     boolean ibanValid = !ibanEmpty && iban.length() >= 22 && iban.length() <= 34; 
     boolean bicEmpty = bic == null || bic.isEmpty(); 
     boolean bicValid = !bicEmpty && bic.length() >= 8 && bic.length() <= 11; 
     boolean instituteEmpty = institute == null || institute.isEmpty(); 

     boolean validState = (ibanEmpty && bicEmpty && instituteEmpty) || ibanValid && bicValid; 

     if (!validState) { 
      throw new IllegalStateException(
       String.format(
        "bank data is not empty and %s%s%s%s%s", 
        !ibanValid ? "iban has to be from 22 to 34 chars long" : "", 
        !ibanValid && !bicValid ? "and" : "", 
        !bicValid ? "bic has to be from 8 to 11 chars long" : "", 
        !ibanValid && !bicValid && instituteEmpty ? "and" : "", 
        instituteEmpty ? "institue must not be empty" : "" 
       ) 
      ); 
     } 
    } 

, die nicht sinnvoll ist, Anmerkungen @Valid. Ein anderer Ansatz wäre die Definition eines benutzerdefinierten Validators wie hier beschrieben: http://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-customconstraints.html

Aber das sieht wirklich wie ein Overkill für meine Einschränkung aus.

Gibt es keinen anderen eleganten Weg?

Dank

Antwort

3

Die Verwendung der Hibernate-Validierungs-API ist nicht so komplex, wie es scheint, und für Ihre Einschränkung ist eine nette Lösung. Sie können jedoch einen einfacheren Weg zum Definieren von Constraints mit dem Hibernate Validator erhalten, wie wir es in einem Projekt getan haben, indem Sie einige Klassen hinzufügen. Ihre Zwänge wird wie folgt aussehen:

@Validate(method = "checkBankData", message = "{BankData.invalid.message}") 
@Entity 
@Table(name = "transaction_receiver") 
public class TransactionReceiver implements Serializable, Addressable { 

Um dies zu erhalten, müssen @Validate Annotation und eine CustomValidator Klasse definieren.

Dieser Ansatz ist nett, wenn Sie weitere Einschränkungen definieren möchten. Und Sie können es mit mehr Funktionen wie Bedingungen für die Validierung erweitern oder das Hinzufügen von mehreren Validierungen usw.

Off-topic:

  • Validation hat nichts mit Frühling Stiefel zu tun, so gibt es keine Notwendigkeit, Erwähnen Sie es in Ihrer Frage.

  • serialVersionUID = 1L; Ist eine sehr schlechte Idee. Verwenden Sie Ihren IDE serialVersionUID-Generator, um dieses Feld mit einem anderen Wert für 1L zu füllen.

0

Um das zu umgehen die Standard JPA Validierung das Äquivalent des Hibernate Validator des @NotEmpty nicht, Sie könnten versuchen, die @size Anmerkung verwenden sie größer oder kleiner ist als eine bestimmte Zahl angeben müssen.

@NotNull 
@Size(min=1) 
private String description; 

Dies ist der sauberste Weg zu gehen, was Sie suchen, um zu tun, dass ich mir vorstellen kann.

Verwandte Themen