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

时间:2016-05-04 07:39:22

标签: java spring spring-mvc

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

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

        ...
    }
}

@Transactional这样的注释是有意义的,这些注释是特定于实现但是@RequestParam@RequestBody等实现特定的?或者这是接口合同的一部分? @RequestBody(required)表明它是合同的一部分,因此应支持在接口上使用它。

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

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

1 个答案:

答案 0 :(得分:5)

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

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