尝试使用 Servlet 打包 REST 应用程序时如何修复“无法转换为 javax.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 应用程序?除其他外,但它似乎没有用。


慕田峪4524236
浏览 107回答 2
2回答

慕桂英546537

有两种定义 JAX-RS servlet 的方法。1)像你拥有的应用程序子类,你可以跳过 web.xml 配置,只添加应用程序注释@ApplicationPath("resources")public class StammSolvaraJahrRestApplication extends Application2) 使用 web.xml 配置<servlet>&nbsp; &nbsp; <display-name>JAX-RS Servlet</display-name>&nbsp; &nbsp; <servlet-name>package.hierarchy.StammSolvaraJahrRestApplication</servlet-name>&nbsp; &nbsp; <init-param>&nbsp; &nbsp; &nbsp; &nbsp; <param-name>javax.ws.rs.Application</param-name>&nbsp; &nbsp; &nbsp; &nbsp; <param-value>package.hierarchy.StammSolvaraJahrRestApplication</param-value>&nbsp; &nbsp; </init-param></servlet><servlet-mapping>&nbsp; &nbsp; <servlet-name>JaxRSServlet</servlet-name>&nbsp; &nbsp; <url-pattern>/*</url-pattern></servlet-mapping>如果您从最后一个跳过 servlet 映射,它将使用您@ApplicationPath指定的值,或者"/resources"如果前一个丢失。

慕的地10843

问题就是它所说的。web.xml 中的这一行需要javax.servlet.Servlet:<servlet-class>backend.backendservice.StammSolvaraJahrRestApplication</servlet-class>由于 anApplication不是javax.servlet.Servlet,因此在处理 XML 文件时会在运行时出现错误。如果可以,我建议您从 Spring Boot 启动应用程序开始。Spring Boot 为您处理所有这些。它甚至可以将 Tomcat 服务器嵌入到 jar 文件中,这样您就可以像运行简单的 Java 应用程序一样运行您的服务器。这样做可以让您不必担心在这里要处理什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java