Spring MVC 5.3.2 java.lang.NullPointerException:无法调用,因为 NULL

问题描述

我知道我在这里做错了,但我无法弄清楚,我需要你的帮助。 我会简短地切入正题:

存储库

enter code here
@Repository
public interface TemplateRepository extends CrudRepository<Template,Integer>{
     @Query("select t.temp_code From Template t where t.temp_area = ?1") 
      public String getTemplateCode(String temp_area);
    
}

服务 @Service("templateservice")

public class TemplateService {

     @Autowired
     TemplateRepository templateRepository;
     
     @Transactional
     public String getLeftMenuArea() {       
      return templateRepository.getTemplateCode("left_menu");
     }   
}

控制器

@Controller
public class TemplateController {
    @Autowired
    static TemplateService templateservice;

    
     public static String getLeftMenu() {
         return templateservice.getLeftMenuArea();
     }
}

JSP

....
    <%      
    TemplateController tc = new TemplateController();
        String test = tc.getLeftMenu();
    
        pageContext.setAttribute("test",test);
     %>                       

                            <div class="tinymce-single responsive-mg-b-30">
                                <div class="alert-title">
                                    <h2>Notice</h2>
                                </div>
                                <div id="summernote1">   <c:out value="${test}" escapeXml="false" />
                                </div>
                            </div>
....

当我运行应用程序时,我收到以下错误消息:

SEVERE: Servlet.service() for servlet [spring] in context with path [/eFatura-CE-Systems] threw exception [Beim Verarbeiten von [/WEB-INF/views/index.jsp] ist in Zeile [1078] eine Ausnahme erzeugt worden

1075:   
1076:   <%      
1077:   TemplateController tc = new TemplateController();
1078:       String test = tc.getLeftMenu();
1079:   
1080:         pageContext.setAttribute("test",test);
1081:      %>                       

Stacktrace:] with root cause
java.lang.NullPointerException: Cannot invoke "de.efatura.service.TemplateService.getLeftMenuArea()" because "de.efatura.controller.TemplateController.templateservice" is null
    at de.efatura.controller.TemplateController.getLeftMenu(TemplateController.java:16)

有没有人比我有更好的想法来使用 Spring Data JPA 方法查询MysqL 数据库获取数据并将其输出到 JSP 文件中?

解决方法

主要原因是您在 JSP 中手动创建了一个新的 TemplateController。如果您手动创建 bean,Spring 不会帮助您自动注入其依赖项(即 TemplateRepository 在这种情况下)。因此,它的依赖项为 NULL,访问时会发生 NPE。

当您想使用 bean 而不是手动创建它时,您应该从 spring 上下文中获取 TemplateController。此外,像您现在所做的那样在 JSP 中混合与业务逻辑相关的 Java 代码被认为是业内最糟糕的做法之一。

相反,您应该计算要在 TemplateController 中显示的数据。将数据放入Model/ModelMap/ModelAndView,然后在JSP中使用EL表达式访问。类似于 thisthis