Класс-нарушитель: javax/servlet/Servlet.class

#java #spring #maven #tomcat #servlets

#java #весна #maven #tomcat #сервлеты

Вопрос:

Я создаю простое весеннее приложение, в котором я хочу вызвать контроллер из AJAX. Но при использовании servlet-api возникают некоторые проблемы. Я добавил зависимость в POM-файл, поскольку я использую HttpServletRequest и HttpServletResponse.

     <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
  

Если я не включаю эту зависимость jar, то HttpServletRequest не может быть разрешен из-за возникшей проблемы с типом. и если я включаю в зависимости maven и добавляю эти зависимости maven в сборку развертывания, то произошла упомянутая ниже ошибка, и tomcat даже не запустился

ИНФОРМАЦИЯ: validateJarFile(D:workspaceUtilities.metadata.pluginsorg.eclipse.wst.server.coretmp0wtpwebappsSpringControllerWebAppWEB-INFlibservlet-api-2.5.jar ) — банка не загружена. Смотрите Спецификацию сервлета 3.0, раздел 10.7.2. Класс-нарушитель: javax/servlet/Servlet.class

и если я удалю зависимости maven из сборки развертывания, сервер tomcat будет запущен, но со следующей ошибкой:

СЕРЬЕЗНОЕ: сервлет [диспетчер] в веб-приложении [/SpringControllerWebApp] выдал исключение load() java.lang.Исключение ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

Пожалуйста, помогите мне в этом сканировании.

 Controller class:

package com.src;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.java.Employee;



@Controller
@RequestMapping("/employee/add.htm")
public class EmployeeController {
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Employee add(HttpServletRequest request,HttpServletResponse response) throws Exception {

    System.out.println("EmployeeController--Start");

    Employee employee = new Employee();
    String firstName = request.getParameter("firstName");
    String lastName = request.getParameter("lastName");
    String email = request.getParameter("email");
    employee.setEmail(email);
    employee.setFirstName(firstName);
    employee.setLastName(lastName);

    System.out.println("EmployeeController--End");
    return employee;
    }
     }
  

 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID"    version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   <display-name>SpringControllerWebApp</display-name>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-   class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>
  

Комментарии:

1. Вы не должны включать servlet 2.5 jar в свою войну, и вы должны строить против servlet 3.0 (поскольку это то, что реализует ваш контейнер).

2. Я изменился с 2.5 на 3.0-alpha-1, но все та же ошибка.

3. К вашему сведению, спецификация Java Servlet теперь на уровне 4.0 . Библиотека API сервлетов находится на уровне 4.0.1, см. Артефакт Maven . Если это вообще возможно, я настоятельно рекомендую использовать их. В Tomcat 9 реализована технология Servlet 4.

4. Я все еще хочу знать, как вы упаковываете эту банку в свою войну, вы уверены, что у вас есть <scope>provided</scope> ? Идея заключается в servlet-api.jar приходит из вашего контейнера сервлета во время выполнения, сообщение об ошибке указывает на раздел спецификации, в котором говорится о гарантиях, которые должен выполнять загрузчик классов, и имеет смысл, что вы пытаетесь их нарушить, если вы включаете servlet-api.jar — хотя я думаю, что ты можешь игратьс модулями в JBoss / Wildfly, чтобы сделать это, если вам действительно нужно (но я не вижу, что вы должны).

5. да, я тоже добавил <scope>provided</scope>, но все равно не повезло