Warum muss ich @RequestParam
Annotation auf Implementierungsklasse anstelle von nur Interface-Klasse verwenden? Ich verwende Schnittstelle und Implementierung in separaten Dateien Ansatz. Es scheint, dass die Verwendung von @RequestParam
auf der Schnittstelle keine Wirkung hat.Warum muss ich die @ @ RequestParam-Annotation nur für die Implementierungsklasse anstelle der Interface-Klasse verwenden?
public interface GreetingService {
@RequestMapping(value = "/greeting", method = RequestMethod.GET)
public Greeting greetingByGet(@RequestParam(value="name", defaultValue="World") String name);
}
@RestController
public class GreetingController implements GreetingService {
@Override
public Greeting greetingByGet(
/**
* Why do I need to duplicate @RequestParam annotation on
* implementation to make it work ???
* Otherwise GET default value is not used.
*/
@RequestParam(value="name", defaultValue="World")
String name) {
...
}
}
Es macht Sinn für Anmerkungen wie @Transactional
die konkrete Umsetzung sind aber @RequestParam
, @RequestBody
usw. Implementierung spezifisch? Oder ist das ein Teil des Schnittstellenvertrags? @RequestBody(required)
schlagen vor, es ist ein Teil des Vertrags, so dass es auf der Schnittstelle sollte unterstützt werden.
Es gibt eine Erklärung hier: Spring MVC Annotated Controller Interface aber die Frage ist: Gibt es eine allgemeinere Idee hinter dieser Erklärung? Oder nur Spring Internals zwingen uns, es so zu tun, wie es jetzt ist?
Es ist schwer zu verstehen, warum Anmerkungen nicht auf die Implementierung vererbt werden.
Also sollten Spring-Annotationen mit '@ Inherited' versehen sein? Für mich und einige meiner Kollegen ist es einfacher, Schnittstellen mit Metadaten wie '@ RequestParam' zu versehen als Implementierungsklassen. – tjuchniewicz
Sie können Methoden-Annotation in Java (noch) und keine Methodenparameter erben. So kann es derzeit nicht gemacht werden, obwohl Ihr Wunsch verständlich ist. – Thomas