我通过加载属性文件从获取值切换到使用@Value注释检索它们。现在我能够打印我设置的值。当我运行我的应用程序时,我看到了值,但是当我打开localhost:8080时,我收到一个空例外。
的IndexController
@Controller
public class IndexController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView getdata() throws IOException {
AppPortList apL = new AppPortList();
List<AppPortModel> apList = apL.getAppPortList();
Collections.sort(apList);
ModelAndView model = new ModelAndView("index");
model.addObject("showap", apList);
return model;
}
属性文件
APP_SERVERS=Server1@!Server1212@!Server12daa21@!Server21334
APP_SERVER_List=1020@!3011@!8080@!2020
//比这更多的服务器。
有错误的类
@Component
public class AppPortList {
@Value("#{'${APP_SERVERS}'.split('@!')}")
private String[] apServerArray;
@Value("#{'${APP_SERVER_List}'.split('@!')}")
private String[] appServerPortsList;
@PostConstruct
public List<AppPortModel> getAppPortList() {
try {
System.out.println(apServerArray.length + "@@@@");
for (int z = 0; z < apServerArray.length; z++) {
String apServer = apServerArray[z];
String[] portListArray=appServerPortsList;
}catch {//stuff}
控制台输出
16@@@@@
当我打开本地主机时,我在第80行收到一个空例外。这是我的声明。 &#34; for(int z = 0; z&lt; apServerArray.length; z ++)&#34;即将到来。
运行本地主机错误
java.lang.NullPointerException: null
at com.spring.web.util.AppPortList.getAppPortList(AppPortList.java:82) ~[classes/:na]
at com.spring.web.controller.IndexController.getdata(IndexController.java:61) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_91]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_91]
尝试2
所以我评论了我的陈述并使用了System.out.println(apServerArray +&#34; @@@@&#34;);
输出2
[Ljava.lang.String;@328b8745@@@@@
当我运行我的localhost时,我得到null。那么为什么我的控制台在运行它时会读取它然后当我打开localhost时它变为空?
null@@@@@
答案 0 :(得分:1)
你在这里看到两件事:
您使用AppPortList
注释@Component
,因此当您启动应用程序时, bean由Spring容器创建,并调用@PostConstruct
。
当一个bean由Spring创建时,它也会为@Value
注释注入值,这就是为什么你在System.out.println()
内的@PostConstruct
中看到正确的输出。
但是,在您的控制器中,您使用的是new AppPortList()
。在这种情况下,您自己创建了bean ,并且您没有使用Spring容器提供的bean。在这种情况下,未选取@Value
注释,因此输出为null
。
解决方案很简单,而不是使用new
关键字,您必须使用依赖注入。当您使用依赖注入时,Spring容器将查找该bean的实例(这得益于@Component
注释),它将在您需要的地方注入它。
在您的情况下,您需要在IndexController
中使用它,因此您需要稍微更改一下:
@Controller
public class IndexController {
@Autowired
private AppPortList apL; // Create this field with @Autowired annotation
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView getdata() throws IOException {
// Remove new AppPortList() and use field in stead
List<AppPortModel> apList = apL.getAppPortList();
// ...
}