部署到Wildfly 8时,简单的JAX-RS应用程序会抛出UnsupportedOperationException

时间:2014-04-23 06:20:09

标签: java web-services maven jax-rs wildfly

我有一个jax-rs应用程序,我想在wildfly 8中运行。

当我尝试迁移它时,我在部署时遇到了一个奇怪的异常。因为它看起来像一个依赖性问题,我想从一个简单的wildfly快速入门示例应用程序中学习。这些是重要的部分:

的pom.xml:

<groupId>org.wildfly.quickstarts</groupId>
<artifactId>wildfly-helloworld-rs</artifactId>
<version>8.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>WildFly Quickstarts: JAX-RS Helloworld</name>
<description>WildFly Quickstarts: Helloworld using JAX-RS</description>

<url>http://wildfly.org</url>
<licenses>
    <license>
        <name>Apache License, Version 2.0</name>
        <distribution>repo</distribution>
        <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
    </license>
</licenses>

<properties>
    <!-- Explicitly declaring the source encoding eliminates the following message: -->
    <!-- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered 
        resources, i.e. build is platform dependent! -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- JBoss dependency versions -->

    <version.wildfly.maven.plugin>1.0.1.Final</version.wildfly.maven.plugin>

    <version.jboss.spec.javaee.7.0>1.0.0.Final</version.jboss.spec.javaee.7.0>


    <!-- other plugin versions -->
    <version.compiler.plugin>3.1</version.compiler.plugin>
    <version.war.plugin>2.1.1</version.war.plugin>

    <!-- maven-compiler-plugin -->
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.source>1.7</maven.compiler.source>
</properties>

<dependencyManagement>
    <dependencies>
        <!-- Define the version of JBoss' Java EE 7 APIs we want to import.
            Any dependencies from org.jboss.spec will have their version defined by this 
            BOM -->
        <!-- JBoss distributes a complete set of Java EE 7 APIs including
            a Bill of Materials (BOM). A BOM specifies the versions of a "stack" (or
            a collection) of artifacts. We use this here so that we always get the correct
            versions of artifacts. Here we use the jboss-javaee-7.0 stack (you can
            read this as the JBoss stack of the Java EE 7 APIs). You can actually
            use this stack with any version of WildFly that implements Java EE 7, not
            just WildFly 8! -->
        <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-7.0</artifactId>
            <version>${version.jboss.spec.javaee.7.0}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>

    <!-- Import the CDI API, we use provided scope as the API is included in JBoss WildFly -->
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Import the Common Annotations API (JSR-250), we use provided scope 
        as the API is included in JBoss WildFly -->
    <dependency>
        <groupId>org.jboss.spec.javax.annotation</groupId>
        <artifactId>jboss-annotations-api_1.2_spec</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Import the JSON API to build JSON Objects -->
    <dependency>
        <groupId>org.jboss.spec.javax.json</groupId>
        <artifactId>jboss-json-api_1.0_spec</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Import the JAX-RS API, we use provided scope as the API is included in JBoss WildFly -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>jaxrs-api</artifactId>
        <scope>provided</scope>
    </dependency>


</dependencies>

<build>
    <!-- Set the name of the war, used as the context root when the app 
        is deployed -->
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>${version.war.plugin}</version>
            <configuration>
           <!-- Java EE 7 doesn't require web.xml, Maven needs to catch up! -->
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <!-- WildFly plugin to deploy war -->
        <plugin>
            <groupId>org.wildfly.plugins</groupId>
            <artifactId>wildfly-maven-plugin</artifactId>
            <version>${version.wildfly.maven.plugin}</version>
        </plugin>
        <!-- Compiler plugin enforces Java 1.6 compatibility and activates 
            annotation processors -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${version.compiler.plugin}</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

我添加了一个配置类:

@ApplicationPath("/rest")
public class Configuration extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = super.getClasses();
        classes.add(HelloWorld.class);
        return classes;
    }
}

当我部署它时,它看起来像这样:

  

14:31:01,325 ERROR [org.jboss.msc.service.fail](MSC服务线程1-1)MSC000001:无法启动服务jboss.undertow.deployment.default-server.default-host./wildfly -helloworld-rs:org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./wildfly-helloworld-rs:无法启动服务

     

...

     

引起:java.lang.UnsupportedOperationException       在java.util.AbstractCollection.add(AbstractCollection.java:252)[rt.jar:1.7.0_25]

编辑:当然,在getClasses方法中设置的类是指 - 剪辑太多

这与我自己的应用程序完全相同。

我错过了什么吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

它的行为与javadoc指定完全相同:

  

实现绝不能修改返回的集合。

     

默认实现返回一个空集。

因此,而不是Set<Class<?>> classes = super.getClasses();只需创建一个新的集合实例。