java 不要在注解中硬编码

ubbxdtey  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(134)

实用工具

public class GeneralUtils {    

    public static String getUrlWithId(String urlsPartStr) {
        // Get a relative URL like /delete/{id} .
        String result = String.format("%s/{id}", urlsPartStr);
        return result;
    }
}

UrlsParts

public class UrlsParts {   

    public static final String delete = "/delete";

    public static final String deleteById = GeneralUtils.getUrlWithId(delete);

}

主计长

@PostMapping(UrlsParts.deleteById)
public String delete(@PathVariable Integer id,
                     Model model) {
    authorRepository.deleteById(id);

    return "redirect:" + Urls.AUTHORS_LIST.getHref();
}

仅供参考:这是Spring。但无论如何,问题是关于核心Java的。

错误

Attribute value must be constant

问题

我尽量不在注解中硬编码字符串。在上一个视频中有一个部分解决方案。但是,坦率地说,我失败得很惨。
你能帮助我吗?任何解决方案都适合我(枚举等)。

ffx8fchx

ffx8fchx1#

正如错误消息所说,注解的参数必须是常量表达式。您可以在JLS中看到“常量”表达式的定义:
常量表达式是表示基元类型值或不突然完成的String的表达式
然后,它继续列出常量表达式的必要和充分条件。下面是一些相关的条件:
(常量表达式)仅使用以下内容组成:

  • 基本类型的文字(§3.10.1,§3.10.2,§3.10.3,§3.10.4)、字符串文字(§3.10.5)和文本块(§3.10.6)
  • 加法运算符+-(§15.18)
  • 引用常量变量(§4.12.4)的简单名称(§6.5.6.1)。
  • TypeName . Identifier形式的限定名(第6.5.6.2节),引用常量变量(第4.12.4节)。
  • [...]

一个“常量变量”是(4.12.4节):
一个final原始类型或String类型的变量,用常量表达式初始化(§15.29)。
值得注意的是,方法调用不是常量表达式,一个原因是方法可能“突然完成”,例如抛出异常。
因此,deleteById不是常量变量,因此表达式deleteById也不是常量表达式。
另一方面,表达式delete + "/{id}" * 是 * 常数表达式,因为delete"/{id}"是常数表达式,并且应用于常数表达式的+也是常数表达式。
我建议声明一个名为byId的独立常量,如果你不想重复写"/{id}"的话。

public static final String byId = "/{id}";
public static final String deleteById = delete + byId;

或者直接使用delete + byId作为注解参数。

相关问题