java.lang.NoClassDefFoundError:javax/el/PropertyNotFoundException当我向控制器发送无效值时

java.lang.NoClassDefFoundError:javax/el/PropertyNotFoundException当我向控制器发送无效值时,java,hibernate,validation,testing,spring-mvc,Java,Hibernate,Validation,Testing,Spring Mvc,我使用MockMvc进行控制器测试 @Test public void updateEvent() throws Exception{ MockHttpServletRequestBuilder request = MockMvcRequestBuilders .post("/updateEvent"); request.param("selectedEventStatusId", "1"); request

我使用MockMvc进行控制器测试

@Test
    public void updateEvent() throws Exception{
        MockHttpServletRequestBuilder request = MockMvcRequestBuilders
                .post("/updateEvent");
        request.param("selectedEventStatusId", "1");
        request.param("selectedEventTypeId", "1");



        Event eventFromDb = createAndSaveEvent();
        request.param("idEvent", eventFromDb.getId().toString());
        request.param("name", eventFromDb.getName());
        request.param("description", eventFromDb.getDescription() +"____");//the reason of problem. if I will write request.param("description", eventFromDb.getDescription() );  its good work mapping if this field below
        request.param("date", new SimpleDateFormat("yyyy-MM-dd").format(eventFromDb.getDate()));
        request.param("eventDate", new SimpleDateFormat("yyyy-MM-dd").format(eventFromDb.getEventDate()));


        ResultActions result = mockMvc.perform(request).andDo(MockMvcResultHandlers.print());

        result.andExpect(MockMvcResultMatchers.view().name("redirect:eventDetails"));
        result.andExpect(MockMvcResultMatchers.model().attributeExists("idEvent"));
        result.andExpect(MockMvcResultMatchers.model().attributeExists("message"));

    }
描述字段标记为

    @Size(min=5)
    @Pattern(regexp="[a-zA-Z]*")    
    private String description;
我看到执行后的下一个stackTrace:

 org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException
        at org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
        at ....
在生产模式下,它工作得很好,但在测试中,若并没有有效值,我会看到错误

控制器方法:

@RequestMapping(value = "/updateEvent", method = RequestMethod.POST)
    public String updateEvent(Model model,
            @Valid @ModelAttribute("existedEvent") Event event,
            BindingResult result,
            @ModelAttribute("linkedCandidates") Set<Candidate> candidates,
            @ModelAttribute("linkedvacancies") Set<Vacancy> vacancies,
            @RequestParam(required = true, value = "selectedEventStatusId")Integer EventStatusId,
            @RequestParam(required = true, value = "selectedEventTypeId")Integer EventTypeId ,
            RedirectAttributes attributes) {
        if (result.hasErrors()) {
            //model.addAttribute("idEvent", event.getId());
            event.setCandidates(candidates);
            event.setVacancies(vacancies);
            return "eventDetails";
        }
        eventService.updateEventAndLinkedEntities(event, candidates, vacancies,EventTypeId,EventStatusId);
        attributes.addAttribute("idEvent",event.getId() );
        attributes.addAttribute("message", "submitted correctly at "+new Date());
        return "redirect:eventDetails";
    }

这是好作品

你能帮我修一下吗

更新

xml(子模块-此处运行的测试)

如果我在
2.2

我看到下一个痕迹:

    updateEvent(com.epam.hhsystem.web.controllers.EventMenuControllerTest)  Time elapsed: 0.398 sec  <<< ERROR!
    org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.ExceptionInInitializerError
        at org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
....
Caused by: java.lang.ExceptionInInitializerError
    at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateExpression(ResourceBundleMessageInterpolator.java:227)

    ....
Caused by: javax.el.ELException: Provider com.sun.el.ExpressionFactoryImpl not found
    at javax.el.FactoryFinder.newInstance(FactoryFinder.java:97)

...
Caused by: java.lang.ClassNotFoundException: com.sun.el.ExpressionFactoryImpl
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

updateEvent(com.epam.hhsystem.web.controllers.EventMenuControllerTest)运行时间:0.398秒您可能只需要在测试中添加依赖项。你在用maven吗?如果是这样的话,你能试着把它添加到你的pom中吗?您可能需要一个不同的jar/版本,但如下所示:

<dependency>
  <groupId>javax.el</groupId>
  <artifactId>javax.el-api</artifactId>
  <version>3.0.0</version>
  <scope>test</scope>
</dependency>

javax.el
javax.el-api
3.0.0
测试

我的pom.xml中没有
el impl

 <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.el</groupId>
                <artifactId>el-api</artifactId>
                <version>2.2</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>org.glassfish.web</groupId>
                <artifactId>el-impl</artifactId>
                <version>2.2</version>
            </dependency>
来自tomcat/lib的jar文件


并从
m2./repository
复制我遇到了相同的问题,添加以下依赖项解决了此问题

当您遇到javax/el/PropertyNotFoundException时,这意味着您错过了el api依赖项,您可以添加以下jar

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

javax.el
埃尔api
2.2
假如


javax.el
javax.el-api
3.0.0
测试
然后您遇到了ClassNotFoundException:com.sun.el.ExpressionFactoryImpl,您错过了el impl jar:

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>el-impl</artifactId>
  <version>2.2</version>
  <scope>test</scope>
</dependency>

org.glassfish.web
厄尔尼普勒
2.2
测试

将以下内容添加到pom中

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>el-impl</artifactId>
  <version>2.2.6</version>
  <scope>test</scope>
</dependency>

org.glassfish.web
厄尔尼普勒
2.2.6
测试

它将解决javax.el的需求。当前版本是2.2.6

你说得对。我用maven。我的项目由两个模块组成。此测试在子模块中进行。我也有类似的依赖。使用2.2提供的**javax.el api**,您确定测试和产品中的版本相同吗?您是如何从命令行运行测试的,还是使用IDE运行测试的?哦,您已经提供了,您可以尝试删除它或使其成为测试吗?我不确定运行测试时是否包含提供的范围依赖项。此外,您可能希望验证缺少的类是否在jar中,您可以执行类似于“jar-tvf el-api-3.0.0.jar | grep PropertyNotFoundException”的操作,它似乎会包含在测试中,这样就不会有问题了。我还看到PropertyNotFoundException.class在2.2 jar中。因此,问题必须在pom设置中。您想在这里发布吗?我看到jsp-api-2.1有一个抽象的javax.el.ExpressionFactory,但没有您发现的newInstance()方法。jsp-api-2.2删除了ExpressionFactory,因此它从el-api-2.2中继承了它,但是没有实现(我可以在您的pom中看到)。我确实在这个依赖项中找到了ExpressionFactoryImpl:com.sun.el-ri 1.0,它可能会修复您最新的ClassNotFoundException,您是否可以尝试一下,可能会导致另一个错误。我还将尝试更多的东西。我和发布问题的人有相同的问题,这个答案对我很有用!Place认为这是对的。@alperakture的答案也是如此。如果添加
el impl
,则可以从pom中删除
el api
依赖项。它将被
el impl
作为一个可传递的依赖项包含。如果您添加了带有测试范围的
el impl
,那么它在正常
编译
阶段不会自动可用。2.2.6版真的在maven repo中可用吗?我没有找到它。但我的问题在2.2版本中得到了解决。有关需要添加此功能的背景信息,请参阅。它还显示了最新的hibernate版本应该使用哪个版本。
<dependency>
  <groupId>javax.el</groupId>
  <artifactId>javax.el-api</artifactId>
  <version>3.0.0</version>
  <scope>test</scope>
</dependency>
 <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.el</groupId>
                <artifactId>el-api</artifactId>
                <version>2.2</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>org.glassfish.web</groupId>
                <artifactId>el-impl</artifactId>
                <version>2.2</version>
            </dependency>
servlet-api
jsp-api
jstl
el-api
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
<dependency>
  <groupId>javax.el</groupId>
  <artifactId>javax.el-api</artifactId>
  <version>3.0.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>el-impl</artifactId>
  <version>2.2</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>el-impl</artifactId>
  <version>2.2.6</version>
  <scope>test</scope>
</dependency>