2017-05-30 3 views
0

Ich implementiere ein In-Memory-API-Gateway zu einem SOAP-Service mit JAXB. Eines der Schemaelemente ist eine "Auswahl", und im Auswahlblock befinden sich mehrere Elemente.Verwenden von javax.validation zum Überprüfen von Bean mit Auswahlmöglichkeiten

Ich versuche, die generierten JAXB-Klassen im Client-Namespace zu spiegeln, daher habe ich für dieses "Auswahl" -Szenario eine Bean-Klasse mit mehreren Eigenschaften, von denen nur eine nicht null ist.

Ich versuche, die Annotation @NotNull von javax.validation zusammen mit der ValidatorFactory und dem Validator zu verwenden. Ein "Wahl" -Szenario macht dies jedoch etwas komplizierter. Ich vermute, dass dies einen benutzerdefinierten ConstraintValidator erfordern würde, zusammen mit einer benutzerdefinierten Annotation, um auf den benutzerdefinierten ConstraintValidator zu verweisen.

Zum Beispiel hier einige gefälschten Code, der einen Teil meiner Struktur ähnelt:

public class InquireRandomInformationRequest { 
    @NotNull(message ="subscriberSelector cannot be null") 
    @Valid 
    private SubscriberSelector subscriberSelector; // required 
    private SelectorMode   mode;    // optional 
... 
} 

public class SubscriberSelector { 
    // Choice 1 
    private String     billingAccountNumber;    // \d{8,9,12,13}; required 
    private MarketInfo    billingMarket;     // optional 

    // Choice 2 
    private String     subscriberNumber;     // \d{10}; required 
    private ValidationCriteria  validationCriteria;    // optional 
    private BillingAccountInformation billingAccountInformation;  // optional 
    private MemoProductType   memoProductType;     // optional 

    // Choice 3 
    private String     unifiedBillingAccountNumber;  // [0-9A-Za-z]{13}; required 
... 
} 

Ich verstehe, dass ich die @Valid Anmerkung auf der „subscriberSelector“ Eigenschaft für den Validator muß das Unterobjekt zu validieren . Darüber hinaus bin ich mir nicht ganz sicher, was ich tun muss, um das Problem der Auswahl zu lösen.

Um zu meinem Beispiel zu passen, benötige ich genau eine von "billingAccountNumber", "subscriberNumber" oder "unifiedBillingAccountNumber", um nicht null zu sein (obwohl ich kompromittieren könnte, einfach die erste nicht Null in einer bestimmten Reihenfolge zu nehmen). In jeder "Auswahlgruppe" sind die anderen Eigenschaften optional, aber es ist möglich, dass eine andere Eigenschaft "erforderlich" ist, wenn diese bestimmte Auswahlgruppe ausgewählt ist (mit anderen Worten, die Auswahleigenschaft ist nicht Null).

Ich habe die Hibernate Validator-Dokumentation durchgesehen, aber ich bin mir nicht sicher, wie genau ich das für diese Situation anwenden soll.

Wenn ich eine benutzerdefinierte Annotation und einen benutzerdefinierten ConstraintValidator definiere, wo wird die Annotation referenziert? Auf der Klasse (wie "SubscriberSelector") oder auf der "subscriberSelector" -Eigenschaft (ersteres erscheint mir logischer).

+0

Das hängt wirklich davon ab, wie der 'ConstraintValidator' definiert ist. Sie können einen "Class Level" 'ConstraintValidator' definieren, indem Sie mit' @Target ({ElementType.TYPE}) 'oder einem" Field Level "' ConstraintValidator' mit '@Target ({ElementType.FIELD}) 'annotieren –

Antwort

0

Abhängig von Ihren Anforderungen können Sie Einschränkungen für die Klasse oder für die Eigenschaft definieren.

Normalerweise werden die Einschränkungen für die Eigenschaft festgelegt. Wenn Sie jedoch angeben, dass mehrere Eigenschaften betroffen und voneinander abhängig sind, sollten Sie die Einschränkung auf Klassenebene platzieren.

Siehe https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-declaring-bean-constraints in unserer Dokumentation.

Verwandte Themen