2017-08-23 3 views
0

Ich habe eine Serviceklasse, die mit @Validated annotiert ist. In dieser Klasse habe ich eine Methode mit einem Argument, das mit @Valid annotiert ist. Wenn die Methode von einer anderen Klasseninstanz mit einem ungültigen Argument aufgerufen wird, wird eine Ausnahme ausgelöst. Wie erwartet wird ein Fehler vom Typ ConstraintViolationException ausgelöst.Spring-Service-Methode Validierung

Wenn ich diese Methode von einer anderen Service-Methode (interner Aufruf) aufrufen, wird keine Validierung durchgeführt und es entsteht ein Fehler im Hauptteil der Methode. Das ist nicht was ich will. Anscheinend werden Anrufe von innen nicht bestätigt. Bei der Untersuchung des Problems habe ich festgestellt, dass die Methode nicht mit einer Spring-Proxy-Bean aufgerufen wurde. I das Problem behoben, indem die von dem Proxy (@Autowired) Anwendungskontext Abrufen und das Verfahren unter Verwendung des Proxy aufzurufen:

((T) context.getBean(this.getClass()).myMethod(validatedArgument) 

Dies ist eine Lösung, hässlich. Wie kann ich Spring so konfigurieren, dass Methodenaufrufe von innen validiert werden?

Antwort

0

Es gibt eine knifflige Möglichkeit, den Dienst für sich selbst zu aktivieren.

@Service 
public class MyService { 

    @Autowired 
    private MyService copy; 

    private void call() { 
    //myMethod(validatedArgument); 
    copy.myMethod(validatedArgument); 
    } 
} 
+0

Leider lässt Frühling dies nicht zu. –

0

Die Art und Weise Frühling behandelt Aspekte ist, dass sie nur aufgerufen werden, wenn eine Instanz eine Nachricht an eine andere Instanz sendet. Es gibt einige Möglichkeiten, dies zu überwinden, aber in Ihrem Fall enthüllt die Tatsache, dass Sie es tun möchten, wahrscheinlich einen Konstruktionsfehler.