尝试使用Servlet打包REST App时如何解决“无法转换为javax.servlet.Servlet”错误

时间:2019-07-11 15:22:03

标签: java jax-rs web.xml

我正在尝试将基于maven的后端Java项目的Angular 7设置到单个war文件中。目前,我正尝试在当前遇到此问题的地方配置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#RESTF183How to deploy a JAX-RS application?,但似乎没有用。

2 个答案:

答案 0 :(得分:1)

问题就出在这里。您的web.xml中的这一行需要javax.servlet.Servlet

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

由于Application不是javax.servlet.Servlet,因此在处理XML文件时会在运行时出错。

如果可以的话,我建议您从Spring Boot启动程序应用程序开始。 Spring Boot会为您处理所有这一切。它甚至可以将Tomcat服务器嵌入jar文件中,以便您可以像简单的Java应用程序一样运行服务器。这样做可以省去您在这里处理的事情的烦恼。

答案 1 :(得分:1)

有两种方法来定义您的JAX-RS servlet。

1)使用与您一样的Application Subclass,您可以跳过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>

如果您从最后一个跳过servlet映射,它将使用您的@ApplicationPath指定的值,或者如果缺少前一个,则使用"/resources"