JBoss EAP 6.4中的JAX-RS应用程序 - JBWEB000260

时间:2016-02-01 10:25:50

标签: java rest jboss jax-rs jboss-eap-6

我将旧的Web应用程序从Tomcat转换为JBoss EAP 6.4。它的REST服务一直在使用我删除的Jersey,因为JBoss EAP 6.4包含RESTeasy,资源只使用jax-rs注释。

对于每项服务,我添加了一个应用程序扩展java.ws.rs.core.Application,例如:

package x.rest.external;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class ExternalApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(ResourceY.class);
        classes.add(ResourceZ.class);
        return classes;
    }
}

我想不使用RESTeasy或JBoss特定方法来声明此服务:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    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">

    [...]

    <servlet>
        <servlet-name>x.rest.external.ExternalApplication</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>x.rest.external.ExternalApplication</servlet-name>
        <url-pattern>/rest/external/*</url-pattern>
    </servlet-mapping>

    [...]

>

据我所知,从规范和各种网络资源中,这应该足以让服务启动并运行。但如果我调用该服务,我得到的是:

10:54:51,630 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/x]] (ServerService Thread Pool -- 44) JBWEB000289: Servlet x.rest.external.ExternalApplication threw load() exception: javax.servlet.ServletException: JBWEB000260: No servlet class has been specified for servlet x.rest.external.ExternalApplication

我知道有一些方法可以使用一些RESTeasy servlet或仅使用注释配置。我希望应用程序尽可能保持容器独立性,并认为基本路径都应该在web.xml描述符中声明。

编辑:似乎归结为RESTEASY-650RESTEASY-738已在RESTeasy 3.x中修复,但JBoss EAP 6.4附带2.3.x.

要避免org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011232: Only one JAX-RS Application Class allowed例外,我要禁用web.xml中的所有resteasy扫描:

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.resources</param-name>
    <param-value>false</param-value>
</context-param>

反过来让JBoss对未指定的servlet感到窒息:javax.servlet.ServletException: JBWEB000260: No servlet class has been specified

如果我使用@ApplicationPathweb.xml声明都禁用了除一个JAX-RS应用程序以外的所有应用程序。

编辑2:在JBoss EAP 7.0测试版中运行良好。

0 个答案:

没有答案