Spring MVC 5.3.2 java.lang.NullPointerException: 无法调用,因为 NULL
Spring MVC 5.3.2 java.lang.NullPointerException: Cannot invoke because 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("模板服务")
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 数据 JPA 方法查询从 MySQL 数据库中获取数据并将其输出到 JSP 文件中?
主要原因是您在JSP中手动创建了一个新的TemplateController
。如果您手动创建一个 bean,Spring 将不会帮助您自动注入它的依赖项(即本例中的 TemplateRepository
)。因此,它的依赖项为 NULL,当您访问它时会发生 NPE。
当您想要使用 bean 而不是手动创建它时,您应该从 spring 上下文中获取 TemplateController
。此外,像您现在所做的那样,将与业务逻辑相关的 java 代码混合在 JSP 中,这被认为是业内最糟糕的做法之一。
相反,您应该计算要在 TemplateController
中显示的数据。将数据放到Model
/ModelMap
/ModelAndView
中,然后在JSP中用EL表达式访问。类似于 this or this.
我知道我在这里做错了什么,但我想不通,我需要你的帮助,谢谢。 我将简明扼要,开门见山:
存储库
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("模板服务")
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 数据 JPA 方法查询从 MySQL 数据库中获取数据并将其输出到 JSP 文件中?
主要原因是您在JSP中手动创建了一个新的TemplateController
。如果您手动创建一个 bean,Spring 将不会帮助您自动注入它的依赖项(即本例中的 TemplateRepository
)。因此,它的依赖项为 NULL,当您访问它时会发生 NPE。
当您想要使用 bean 而不是手动创建它时,您应该从 spring 上下文中获取 TemplateController
。此外,像您现在所做的那样,将与业务逻辑相关的 java 代码混合在 JSP 中,这被认为是业内最糟糕的做法之一。
相反,您应该计算要在 TemplateController
中显示的数据。将数据放到Model
/ModelMap
/ModelAndView
中,然后在JSP中用EL表达式访问。类似于 this or this.