常量和注释

时间:2009-10-02 15:38:43

标签: java

这可能是一个愚蠢的问题,由于缺少对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错误

4 个答案:

答案 0 :(得分:4)

sel是最终的静态,但是在第一次加载此类时会对其值进行求值。 @annotations在编译时进行评估,因此出错。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

sel不是JLS中定义的常量,因为它无法在编译时完全解析。注释需要在编译时完全解析,因为它们被引入类定义 - 它们不是运行时属性(这是它们的缺点)。

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

答案 3 :(得分:0)

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

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