目前我正在尝试通过创建一个接口CRUDRestController
来减少java spring控制器中的样板文件,这会创建一组通用的默认端点:
interface CRUDRestController<T, Key extends Serializable> {
//...
String getEndpoint();
@RequestMapping(value = getEndpoint() + "/{key}", method = RequestMethod.GET)
default T get(@PathVariable("key") String key) {
return getRepository().findOne(stringToKey(key));
}
//...
}
问题是上面的代码没有编译,因为value = getEndpoint() + "/{key}"
应该不是编译时常量。实际上,每个控制器的getEndpoint()
实现都是这样的:
@Override
public String getEndpoint() {
return "/clients";
}
这在编译时是众所周知的,但我无法告诉它春天。有什么想法吗?
答案 0 :(得分:1)
也许对您有帮助:
interface CRUDRestController<T, Key extends Serializable> {
@RequestMapping(value = "/{key}", method = RequestMethod.GET)
default T get(@PathVariable("key") String key) {
return getRepository().findOne(stringToKey(key));
}
}
和实现:
@RequestMapping("/clients")
public class ClientController implements CRUDRestController<Client, ClientKey> {
//...
}
答案 1 :(得分:0)
这是Java注释限制。传递给它的所有值必须是编译时常量 即使您将静态方法调用返回静态final,也无法在编译时知道该值。