簡體   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