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).
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 –