java - Spring Mvc 表单处理程序中的 NoClassDefFoundError

标签 java spring maven jsp spring-mvc

我在处理一个小型 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,

enter image description here

对应的 Controller 代码,

    @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 并从那里得到错误。下面提供了相应的 Controller 代码,

@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 请求的 Controller 方法,

// 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";
        }
    }

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

最佳答案

类 ExpressionEvaluationUtils 它是旧类,在 spring 4 之前这个类被删除了。如果你看到类似的东西:

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

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

关于java - Spring Mvc 表单处理程序中的 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44869168/

相关文章:

java - 描述实例的最简单方法

java - .NET 等同于 Java 的 List.subList()?

java - 创建名称为 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping' 的 bean 时出错

java - Spring-Hibernate-Maven-Web 应用程序中外包 POJO + DAO + Service 导致 Hibernate 中的 ArrayIndexOutOfBounds

IntelliJ 中的 Maven 配置产生授权异常

Java 检查 MouseReleased 位置是否在两点之间

java - 如何防止LinkedHashMap替换Key/Value?

java - Maven中在构建主项目时如何构建作为依赖添加到主项目中的依赖项目?

java - Spring Restful中传输BigDecimal类型

java - Spring 从 Retrofit 获取 Null 值