为什么我必须在实现类而不是接口类上使用`@RequestParam`注释?

tju*_*icz 2 java spring spring-mvc

为什么我必须@RequestParam在实现类而不是接口类上使用注释?我在单独的文件方法中使用接口和实现.似乎@RequestParamon接口的使用没有效果.

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) {

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它是有意义的注解像@Transactional这是实现特定的,但@RequestParam,@RequestBody等实现特定的?或者这是接口合同的一部分?@RequestBody(required)建议它是合同的一部分,因此应该支持在接口上使用它.

这里有一个解释:Spring MVC Annotated Controller Interface但问题是:这个解释背后是否有更一般的想法?或者只有Spring internals强迫我们像现在这样做?

很难理解为什么注释不会继承到实现.

Tho*_*mas 6

Java不为接口上的注释提供继承,也不为方法或方法参数提供继承.虽然有一个@Inherited注释,但它仅适用于类级别,请参阅http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Inherited.html

所以这不是由于Spring或设计决策,而是由于Java语言设计.