我正在尝试将基于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#RESTF183和How to deploy a JAX-RS application?,但似乎没有用。
答案 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"
。