2016-05-04 5 views
1

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.

Antwort

3

Java bietet keine Vererbung für Annotationen an Schnittstellen, noch für Methoden oder Methodenparameter. Zwar gibt es eine @Inherited Anmerkung, es funktioniert nur auf Klassenebene findet http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Inherited.html

So dieser Frühling oder eine Design-Entscheidung nicht fällig ist, es geht um das Java-Sprache Design.

+0

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

+0

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

Verwandte Themen