Как исправить ошибку «невозможно привести к javax.servlet.Servlet» при попытке упаковать REST-приложение с сервлетом - PullRequest
2 голосов
/ 11 июля 2019

Я пытаюсь настроить Angular 7 с внутренним java-проектом на основе maven в один военный файл. В данный момент я пытаюсь настроить файл web.xml, в котором у меня возникла эта проблема. Я совсем не уверен, является ли мой подход правильным или «хорошим», поэтому сначала я опишу, что я пытаюсь сделать (если вы думаете об этом лучше, поправьте меня).
Итак, у меня есть пара JAX-RS классов, которые я бы хотел использовать как REST API. Для этой цели я создал соответствующие javax.ws.rs.core.Application классы для предоставления этих компонентов REST. Затем я включаю классы Application в файл web.xml. Ниже приведены файлы:

web.xml

 <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>backend.backendservice.StammSolvaraJahrRestApplication</servlet-name>
    <servlet-class>backend.backendservice.StammSolvaraJahrRestApplication</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>backend.backendservice.StammSolvaraJahrRestApplication</servlet-name>
    <url-pattern>/rmz/*</url-pattern>
  </servlet-mapping>

Еще один вариант web.xml, который я пробовал

 <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>backend.backendservice.StammSolvaraJahrRestApplication</servlet-name>
    <servlet-class>backend.backendservice.StammSolvaraJahrRestApplication</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>backend.backendservice.StammSolvaraJahrRestApplication</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>backend.backendservice.StammSolvaraJahrRestApplication</servlet-name>
    <url-pattern>/rmz/*</url-pattern>
  </servlet-mapping>

Класс применения

public class StammSolvaraJahrRestApplication extends Application {

  @Override
  public Set<Class<?>> getClasses() {
    Set<Class<?>> sets = new HashSet<>();
    sets.add(StammSolvaraJahrRest.class);
    return sets;
  }

}

Я получаю ошибку: java.lang.ClassCastException: backend.backendservice.StammSolvaraJahrRestApplication cannot be cast to javax.servlet.Servlet, и если я удалю <servlet-class>, я получу No servlet class has been specified for servlet. Я следую https://docs.oracle.com/cd/E24329_01/web.1211/e24983/configure.htm#RESTF183 и Как развернуть приложение JAX-RS? среди других, но, похоже, оно не работает.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Существует два способа определения вашего сервлета JAX-RS.

1) С подклассом приложения, подобным тому, который у вас есть, вы можете пропустить конфигурацию web.xml и просто добавить аннотацию приложения

@ApplicationPath("resources")
public class StammSolvaraJahrRestApplication extends Application

2) С конфигурацией web.xml

<servlet>
    <display-name>JAX-RS Servlet</display-name>
    <servlet-name>package.hierarchy.StammSolvaraJahrRestApplication</servlet-name>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>package.hierarchy.StammSolvaraJahrRestApplication</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>JaxRSServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Если вы пропустите отображение сервлета из последнего, оно будет использовать ваше @ApplicationPath указанное значение или "/resources", если предыдущее отсутствует.

1 голос
/ 11 июля 2019

Проблема только в том, что она говорит. Эта строка в вашем web.xml требует javax.servlet.Servlet:

<servlet-class>backend.backendservice.StammSolvaraJahrRestApplication</servlet-class>

Поскольку Application не является javax.servlet.Servlet, вы получаете сообщение об ошибке во время выполнения при обработке вашего XML-файла.

Если вы можете, я бы посоветовал вам начать со стартового приложения Spring Boot. Spring Boot обрабатывает все это для вас. Он может даже встроить сервер Tomcat в JAR-файл, чтобы вы могли запустить свой сервер как простое Java-приложение. Это избавит вас от необходимости беспокоиться о том, с чем вы здесь работаете.

...