Какой поставщик контейнеров поддерживает org.apache.cxf.jaxrs.JAXRSServerFactoryBean? - PullRequest
0 голосов
/ 29 января 2019

Используя информацию, представленную ниже, вы можете ответить на следующие вопросы:

  1. Какой поставщик контейнеров поддерживает org.apache.cxf.jaxrs.JAXRSServerFactoryBean, чтобы я мог добавить свое приложение с помощью org.glassfish.jersey.server.ContainerFactory при создании конечной точки?
  2. Что не так с приведенным ниже приложением, которое заставляет (JAXRSServerFactoryBean)RuntimeDelegate.getInstance().createEndpoint(app, JAXRSServerFactoryBean.class); вызвать исключение недопустимого аргумента?

Я пытаюсьразвернуть приложение JAX-RS, которое использует аннотации ( no web.xml ), в систему, которая использует Java Application Manager (это проприетарная система, которая портирована на некоторые библиотеки менеджера приложенийно я не уверен, что это из-за небольшой сопроводительной документации вокруг него.)

На высоком уровне у меня есть Java-приложение, которое использует аннотации JAX-RS, такие как ApplicationPath, Path, Produces / Consumes иJsonProperty, чтобы попытаться создать конечную точку на «сервере приложений».Я говорю «сервер приложений», потому что у меня нет документации по этой системе, поэтому я просто назову это так.При попытке запустить приложение я получаю следующее исключение:

java.lang.IllegalArgumentException: No container provider supports the type class org.apache.cxf.jaxrs.JAXRSServerFactoryBean
    at org.glassfish.jersey.server.ContainerFactory.createContainer(ContainerFactory.java:64)
    at org.glassfish.jersey.server.internal.RuntimeDelegateImpl.createEndpoint(RuntimeDelegateImpl.java:47)
    at com.app.Server.startServer(Server.java:182)

Я исследовал java.lang.IllegalArgumentException, брошенный функцией org.glassfish.jersey.server.internal.RuntimeDelegateImpl.createEndpoint.Я не уверен, почему это будет сделано, потому что на обложке кажется, что класс приложения правильно аннотирован и extends Application.

Мне удалось посмотреть код класса Сервера, и вот что делается:

Код сервера

Здесь фрагмент кода com.app.Server.startServer(Server.java:182), я не могу изменить этот код:

inside of startServer...

Application app = (Application) Class.forName("com.app.MyApplication").newInstance();

JAXRSServerFactoryBean jaxrsServerFactory = (JAXRSServerFactoryBean)RuntimeDelegate.getInstance().createEndpoint(app, JAXRSServerFactoryBean.class);

Теперь мой код:

Код приложения

MyApplication

package com.app;

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

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import com.app.services.ServiceOne;

@ApplicationPath("base/path")
public class MyApplication extends Application {

    public MyApplication() {
        System.out.println(Long.toString(System.nanoTime()) + " " + this.getClass().getName() + " constructor called...");
    }

    /* (non-Javadoc)
     * @see javax.ws.rs.core.Application#getClasses()
     */
    @Override
    public Set<Class<?>> getClasses() {
        System.out.println(Long.toString(System.nanoTime()) + " " + this.getClass().getName() + " getClasses() method called...");
        Set<Class<?>> classes = new HashSet<>();
        classes.add(ServiceOne.class);
        return classes;
    }
}

Службы моего приложения

package com.app.services.ServiceOne;

import java.util.ArrayList;

import javax.ws.rs.Consumes;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

// pretend the model imports are here...

@Path("serviceOne")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ServiceOne {

    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseObject performService(InputObject body) throws NotFoundException {
        // do whatever to get result and send...
    }

}

Pom.xml Плагины и зависимости

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-jdk-http</artifactId>
            <version>2.28-RC4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.28-RC4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.28-RC4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.28-RC4</version>
        </dependency>
    </dependencies>

Еще раз спасибоза вашу помощь!

1 Ответ

0 голосов
/ 30 января 2019

Я разобрался с ответом на мой вопрос.

Система, в которой я пытался развернуть свое приложение, уже установила jar файлы, установленные в системе в различных каталогах.

Я обновил свое приложение, добавив эти jar файлы.Это было сделано путем обновления дескриптора, который я использую для развертывания приложения в системе.

Затем я и установил scope определенных зависимостей в моем pom.xml на <scope>provided</scope> так, чтобы, когда приложение былоупакованные Maven, эти зависимости не будут включены в окончательный вариант.

Ниже приведен пример:

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.8</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-jdk-http</artifactId>
            <version>2.28-RC4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.28-RC4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.28-RC4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.28-RC4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...