繁体   English   中英

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

[英]How to fix 'cannot be cast to javax.servlet.Servlet' error while trying to package REST App with Servlet

我正在尝试使用基于 maven 的后端 java 项目将 Angular 7 设置为单个 war 文件。 目前,我正在尝试配置当前遇到此问题的web.xml文件。 我完全不确定我的方法是否有效或“好”,因此我将首先描述我正在尝试做的事情(如果您在这方面认为更好,请纠正我)。
所以我有几个JAX-RS类,我想将它们用作REST API 为此,我创建了相应的javax.ws.rs.core.Application类来提供这些 REST 组件。 然后我将Application类包含在web.xml文件中。 以下是文件:

网页.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 应用程序? 除其他外,但似乎不起作用。

问题正是它所说的。 web.xml 中的这一行需要一个javax.servlet.Servlet

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

由于Application不是javax.servlet.Servlet ,因此在处理 XML 文件时,您会在运行时收到错误消息。

如果可以,我建议您从 Spring Boot 启动器应用程序开始。 Spring Boot 为您处理所有这些。 它甚至可以在 jar 文件中嵌入一个 Tomcat 服务器,这样您就可以像运行一个简单的 Java 应用程序一样运行您的服务器。 这样做可以让您不必担心在这里处理的事情。

有两种方法可以定义 JAX-RS servlet。

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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM