使用@Value Annotations时为什么会收到Null异常?

时间:2016-12-06 21:46:44

标签: java spring-boot

我通过加载属性文件从获取值切换到使用@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@@@@@

1 个答案:

答案 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();   
        // ...
}