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

时间:2021-04-08 19:50:08

标签: java mysql spring nullpointerexception spring-repositories

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

存储库

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 文件中?

1 个答案:

答案 0 :(得分:0)

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

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

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