【问题标题】:Constants and annotation常量和注解
【发布时间】:2009-10-02 15:38:42
【问题描述】:

这可能是一个愚蠢的问题,由于缺少对 java 的一些理解,但我有这个代码:

@Stateless
@WebService
public class MLHRequesterBean implements MLHRequesterBeanRemote {

    private final static String sel = "MLHRequesterPU" + (isProduction()? " " : "-dev");

    public static boolean isProduction(){
        try {
           if (Inet4Address.getLocalHost().getHostName().equalsIgnoreCase("ironman")) {
                return true;
            }
        } catch (UnknownHostException ex) {}
        return false;
    }

    @PersistenceContext(unitName=sel)
    ...

为什么 sel 不被视为常数?我们有我们的测试服务器和生产服务器,每个服务器都应该写入不同的数据库。我该如何克服这个问题?

这是错误:

C:\projects\workspace\MLHRequester\MLHRequester-ejb\src\java\mlh\MLHRequesterBean.java:33:属性值必须是常量 @PersistenceContext(unitName=sel) 1 个错误

【问题讨论】:

    标签: java


    【解决方案1】:

    sel 是一个最终的静态变量,但它的值是在第一次加载此类时评估的。 @annotations 是在编译时评估的,因此会出现错误。

    您最好在构建期间执行宏/替换预处理步骤以生成正确的值(可能基于 .properties 文件)。

    【讨论】:

      【解决方案2】:

      常量是可以在编译时完全解析的值,您的 sel 变量不能因为它需要查询本地主机名,因此在 run 之前无法对其进行评估时间。

      【讨论】:

        【解决方案3】:

        sel 不是 JLS 中定义的常量,因为它不能在编译时完全解析。注释需要在编译时完全解析,因为它们会融入到类定义中——它们不是运行时属性(这是它们的缺点)。

        要在运行时通过 EJB 动态获得这种行为,您必须使用 EntityManagerFactory。

        【讨论】:

          【解决方案4】:

          我必须研究在解决注释之前是否执行静态初始化程序块(即解决真正的问题),但您应该使用静态块来处理这样的事情:

          public class MLHRequesterBean implements MLHRequesterBeanRemote 
          {
              private final static String sel;
              static
              {
                  String suffix = (Inet4Address.getLocalHost().getHostName().equalsIgnoreCase("ironman")) ? " " : "dev";
                  sel = "MLHRequesterPU".concat(suffix);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-09-09
            • 1970-01-01
            • 2011-04-02
            • 2017-10-25
            • 2010-11-26
            • 1970-01-01
            • 2021-01-18
            • 1970-01-01
            相关资源
            最近更新 更多