为什么我必须在实现类而不是接口类上使用@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强迫我们像现在这样做?
很难理解为什么注释不会继承到实现。
答案 0 :(得分:5)
Java不为接口上的注释提供继承,也不为方法或方法参数提供继承。
虽然有@Inherited
注释,但它仅适用于班级,请参阅http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Inherited.html
所以这不是由于Spring或设计决定,而是由于Java语言设计。