这对我来说非常奇怪:
1)我有一节课
public class Data {
private static String name;
public static String getName() {
return name;
}
public static void setName (String n){
Data.name = n;
}
}
这个类变量名是在我的服务器( WAS liberty中的J2EE应用程序)启动时正确设置的-我想在整个服务器生命周期中缓存这些数据。
2)但是当我遇到一个URL,它最终调用了一个执行getter的代码时:
Data.getName(); // this returns null??
有人能想出一个可能的原因吗?也不能调试,我很沮丧。
为了更多地说明我的问题,让我展示一下我的项目结构:
耳朵
CommonJar
WAR1 WAR2
我的Data.java在CommonJar中。这个Data.java是在WAR1中注册的侦听器触发服务器启动时在web.xml中初始化的,从这里我看到了它的设置,并且我使用Data.getName()看到了非空值。--这是我在最初的帖子中的第一步。
然后我在WAR2中有了一个restful风格的HelloWorld服务。当我调用这个HelloWorld服务时,我看到Data.getName()返回null。--这是我在原始帖子中的第二步。甚至不要认为语法类型是容易出错的,因为它不是这样的。
我的理论是:似乎在步骤1中Data.java是由WAR1中的类加载器加载的,然后在我的步骤2中是WAR 2加载的,步骤2加载了一个空的数据类。
为了验证这一理论是否正确,我将Data.java初始化步骤移到了WAR2中(我再次看到它已设置,并且使用Data.getName()看到了非空值),不同之处在于,当我调用此HelloWorld服务时,我看到Data.getName()返回预期的非空值。这一步是我所谓的故障排除突破,因为它似乎表明我的理论是正确的。(但我不能通过在我的实际问题修复中移动代码来修复问题)
那么问题是如何修复,以及如何直观地查看哪个类是由哪个类加载器加载的,以及何时加载的?同样基于WAS Liberty文档,默认的类加载器将是parentsfirst,这意味着Data.java应该由父级加载(在本例中是EAR),所以我不应该把问题放在第一位。
任何人,请指导如何进一步看到问题并解决它?谢谢。
发布于 2018-07-08 03:20:55
您的getName()函数在声明时没有返回类型,但仍试图返回字符串。
https://stackoverflow.com/questions/51226097
复制相似问题