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