属性值必须是常量:@RequestMapping,java spring endpoint

时间:2018-02-17 18:47:17

标签: rest spring-mvc annotations

目前我正在尝试通过创建一个接口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";
}

这在编译时是众所周知的,但我无法告诉它春天。有什么想法吗?

2 个答案:

答案 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,也无法在编译时知道该值。