【问题标题】:NoClassDefFoundError in the Spring Mvc form handlerSpring Mvc 表单处理程序中的 NoClassDefFoundError
【发布时间】:2017-12-05 18:06:05
【问题描述】:

我使用一个小型 Spring Mvc 项目,在处理 POST 请求时出现错误。错误信息如下,

HTTP Status 500 – Internal Server Error

Type Exception Report

Message An exception occurred processing JSP page [/WEB-INF/jsps/users/userform.jsp] at line [26]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: An exception occurred processing JSP page [/WEB-INF/jsps/users/userform.jsp] at line [26]

23: 
24:     <spring:url value="/users" var="userActionUrl"/>
25: 
26:     <form:form class="form-horizontal" method="post" modelAttribute="userForm" action="${userActionUrl}">
27: 
28:         <form:hidden path="id"/>
29: 


Root Cause

javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/springframework/web/util/ExpressionEvaluationUtils
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
    org.apache.jsp.WEB_002dINF.jsps.users.userform_jsp._jspService(userform_jsp.java:1278)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

登陆页面在这里(list.jsp)并映射到http://localhost:8080/users

对应的控制器代码,

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String showHome() {

        logger.debug("showHome()");

        return "redirect:/users";
    }

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public String showAllUsers(Model model) {

        logger.debug("showAllUsers()");
        model.addAttribute("users", userService.findAllUsers());
        return "users/list";
    }

当我按下Add User 按钮时,它会指向地址http://localhost:8080/users/add。该页面显示文件userform.jsp 并从那里得到错误。下面提供了相应的控制器代码,

@RequestMapping(value = "users/add", method = RequestMethod.GET)
public String showAddUserForm(Model model) {

    logger.debug("showAddUserForm()");

    User user = new User();

    user.setName("mkyong123");
    user.setEmail("test@gmail.com");
    user.setAddress("abc 88");

    //user.setPassword("123");
    //user.setConfirmPassword("123");
    user.setNewsletter(true);
    user.setSex("M");
    user.setFramework(new ArrayList<String>(Arrays.asList("Spring MVC", "GWT")));
    user.setSkill(new ArrayList<String>(Arrays.asList("Spring", "Grails", "Groovy")));
    user.setCountry("SG");
    user.setNumber(2);

    model.addAttribute("userForm", user);

    populateDefaultModel(model);
    return "users/userform";
}

下面提供userform.jsp页面中的必要代码,

<form:form class="form-horizontal" method="post" modelAttribute="userForm" action="${userActionUrl}">

    <form:hidden path="id"/>

    <spring:bind path="name">
        <div class="form-group ${status.error ? 'has-error' : ''}">
            <label class="col-sm-2 control-label">Name</label>
            <div class="col-sm-10">
                <form:input path="name" type="text" class="form-control " id="name" placeholder="Name"/>
                <form:errors path="name" class="control-label"/>
            </div>
        </div>
    </spring:bind>

 </form:form>

我在该行中收到错误消息,

<form:form class="form-horizontal" method="post" modelAttribute="userForm" action="${userActionUrl}">

这是处理POST请求的控制器方法,

// save or update user
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String saveOrUpdateUser(@ModelAttribute("userForm") @Validated User user,
            BindingResult result, Model model, final RedirectAttributes redirectAttributes) {

        logger.debug("saveOrUpdateUser() : {}", user);

        if (result.hasErrors()) {
            populateDefaultModel(model);
            return "users/userform";
        } else {
            redirectAttributes.addFlashAttribute("css", "success");

            if(user.isNew()){
                redirectAttributes.addFlashAttribute("msg", "User added successfully!");
            }else{
                redirectAttributes.addFlashAttribute("msg", "User updated successfully!");
            }

            userService.saveOrUpdate(user);

            // POST/REDIRECT/GET
            return "redirect:/users/" + user.getId();

            // POST/FORWARD/GET
            // return "user/list";
        }
    }

我需要更改什么才能正常运行?

【问题讨论】:

  • class ExpressionEvaluationUtils 是旧类,看起来你在 maven 中依赖旧版本的 spring,
  • 抛出你的 pom.xml 以便我们看到你的 spring 版本
  • @sbjavateam 这个问题确实是由于 pom.xml 文件中的旧版本依赖项造成的。我将所有这些更新到RELEASE,问题就解决了。你能把它写成一个可以帮助其他用户的答案吗?
  • 完成。希望它能解释要点

标签: java spring maven jsp spring-mvc


【解决方案1】:

class ExpressionEvaluationUtils 它是旧类,在春季 4 之前该类已被删除。如果你看到类似的东西:

java.lang.NoClassDefFoundError: org/springframework/web/util/ExpressionEvaluationUtils

这意味着你在 pom.xml 中有一些旧版本的 spring(这个类不再在最新的 spring 版本的 classpath /dependencies 中)。要解决这个问题,只需将依赖项更新到您使用的相关版本即可。

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 2011-10-08
    • 2018-03-20
    • 2015-10-16
    • 2015-11-23
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多