RESTEasy (jax-rs),web.xml 中的多个包声明?
RESTEasy (jax-rs), multiple packages declaration in web.xml?
如何在 web.xml 中为 RESTEasy jax-rs 提供程序声明多个包?
如果我有:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<!-- this need same with resteasy servlet url-pattern -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part1.MessageApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
有效。
但是如果我有 :
然后更改 web.xml 的声明(基于 ,可能已经在 Jersey 工作)
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part1.MessageApplication;part2.MessageApplication2</param-value>
</init-param>
</servlet>
每当我尝试访问包“part2
”中的@Path
-mapped-class时,它会抛出:
java.lang.RuntimeException: java.lang.ClassNotFoundException: part1.MessageApplication;part2.MessageApplication2 from
请注意,我知道我已经将 @Path
-mapped-class 更改为不同的 url 路径,例如 @Path("controller2")
.
如何在 web.xml
中正确配置它?
不确定我是否清楚地理解你的问题。 you provided in your question is about specifying multiple packages. But looks like you are dealing with two Application
subclasses。这是另一回事。
在这种情况下,您应该注册两个 HttpServletDispatcher
映射到不同的 URI 模式,如下所示:
<!-- Application 1 (part1.MessageApplication) mapped to /rest/app1/* -->
<servlet>
<servlet-name>resteasy-application1</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part1.MessageApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-application1</servlet-name>
<url-pattern>/rest/app1/*</url-pattern>
</servlet-mapping>
<!-- Application 2 (part2.MessageApplication2) mapped to /rest/app2/* -->
<servlet>
<servlet-name>resteasy-application2</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part2.MessageApplication2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-application2</servlet-name>
<url-pattern>/rest/app2/*</url-pattern>
</servlet-mapping>
每个 Application
subclass is mapped to a path that serves as the base URI for the resource URIs provided by @Path
注释。
例如,当您支持 API 的多个版本时,您可以有多个 Application
子 class。对于简单的应用程序,您很可能不需要它。
您可能不需要 web.xml
根据您的 ,您使用的是 WildFly 8。它与 Servlet 3.0 兼容,因此您甚至不需要 web.xml
简单应用程序的部署描述符。大多数配置,例如注册 servlet、过滤器和侦听器都可以通过注释完成。
如果您没有为基于 Maven 的 Web 应用程序项目提供 web.xml
部署描述符,则需要将 maven-war-plugin
to ignore the missing web.xml
file by setting the failOnMissingWebXml
配置 属性 配置为 false
在您的项目 pom.xml
文件中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
由于 maven-war-plugin
, the default value for failOnMissingWebXml
的 3.0.0 版本已从 true
更改为 false
。您可以使用最新版本并省略该配置 属性.
如果出于某种原因,你想保留 web.xml
,它可以很简单:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
关于Application
class
的几句话
关于 JAX-RS,用 @ApplicationPath
注释您的 Application
subclass 指定资源的基本 URI classes:
@ApplicationPath("api")
public SampleApplication extends Application {
}
在上面的示例中,JAX-RS 运行时将扫描 classJAX-RS 组件的路径并自动注册它们。
如果您想手动注册您的资源和提供者(防止 JAX-RS 运行时自动注册组件),请覆盖 getClasses()
and/or the getSingletons()
方法:
@ApplicationPath("api")
public SampleApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(MyResource.class);
resources.add(MyOtherResource.class);
return resources;
}
}
有关 Application
class 的更多详细信息,此 可以为您提供一些见解。
管理您的依赖关系
值得一提的是RESTEasy 3.x is shipped with WildFly。如果您只使用 JAX-RS API,则以下依赖项将为您提供所需的一切:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
如果您需要使用 RESTEasy API 中的任何类型,请在 provided
范围内添加 RESTEasy 3.x 依赖项。它告诉 Maven 容器将提供该依赖项,因此它们不会随您的应用程序一起提供。未能提供正确的范围可能会导致一些奇怪的错误和令人头疼的问题。有关作用域的更多详细信息,请查看 dependency scope documentation.
如何在 web.xml 中为 RESTEasy jax-rs 提供程序声明多个包?
如果我有:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<!-- this need same with resteasy servlet url-pattern -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part1.MessageApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
有效。
但是如果我有 :
然后更改 web.xml 的声明(基于
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part1.MessageApplication;part2.MessageApplication2</param-value>
</init-param>
</servlet>
每当我尝试访问包“part2
”中的@Path
-mapped-class时,它会抛出:
java.lang.RuntimeException: java.lang.ClassNotFoundException: part1.MessageApplication;part2.MessageApplication2 from
请注意,我知道我已经将 @Path
-mapped-class 更改为不同的 url 路径,例如 @Path("controller2")
.
如何在 web.xml
中正确配置它?
不确定我是否清楚地理解你的问题。 Application
subclasses。这是另一回事。
在这种情况下,您应该注册两个 HttpServletDispatcher
映射到不同的 URI 模式,如下所示:
<!-- Application 1 (part1.MessageApplication) mapped to /rest/app1/* -->
<servlet>
<servlet-name>resteasy-application1</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part1.MessageApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-application1</servlet-name>
<url-pattern>/rest/app1/*</url-pattern>
</servlet-mapping>
<!-- Application 2 (part2.MessageApplication2) mapped to /rest/app2/* -->
<servlet>
<servlet-name>resteasy-application2</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>part2.MessageApplication2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-application2</servlet-name>
<url-pattern>/rest/app2/*</url-pattern>
</servlet-mapping>
每个 Application
subclass is mapped to a path that serves as the base URI for the resource URIs provided by @Path
注释。
例如,当您支持 API 的多个版本时,您可以有多个 Application
子 class。对于简单的应用程序,您很可能不需要它。
您可能不需要 web.xml
根据您的 web.xml
简单应用程序的部署描述符。大多数配置,例如注册 servlet、过滤器和侦听器都可以通过注释完成。
如果您没有为基于 Maven 的 Web 应用程序项目提供 web.xml
部署描述符,则需要将 maven-war-plugin
to ignore the missing web.xml
file by setting the failOnMissingWebXml
配置 属性 配置为 false
在您的项目 pom.xml
文件中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
由于 maven-war-plugin
, the default value for failOnMissingWebXml
的 3.0.0 版本已从 true
更改为 false
。您可以使用最新版本并省略该配置 属性.
如果出于某种原因,你想保留 web.xml
,它可以很简单:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
关于Application
class
的几句话
关于 JAX-RS,用 @ApplicationPath
注释您的 Application
subclass 指定资源的基本 URI classes:
@ApplicationPath("api")
public SampleApplication extends Application {
}
在上面的示例中,JAX-RS 运行时将扫描 classJAX-RS 组件的路径并自动注册它们。
如果您想手动注册您的资源和提供者(防止 JAX-RS 运行时自动注册组件),请覆盖 getClasses()
and/or the getSingletons()
方法:
@ApplicationPath("api")
public SampleApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(MyResource.class);
resources.add(MyOtherResource.class);
return resources;
}
}
有关 Application
class 的更多详细信息,此
管理您的依赖关系
值得一提的是RESTEasy 3.x is shipped with WildFly。如果您只使用 JAX-RS API,则以下依赖项将为您提供所需的一切:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
如果您需要使用 RESTEasy API 中的任何类型,请在 provided
范围内添加 RESTEasy 3.x 依赖项。它告诉 Maven 容器将提供该依赖项,因此它们不会随您的应用程序一起提供。未能提供正确的范围可能会导致一些奇怪的错误和令人头疼的问题。有关作用域的更多详细信息,请查看 dependency scope documentation.