RESTEasy Java 11、Tomcat 10.1 如何部署运行

问题描述 投票:0回答:1

从那时起,我就在谷歌上搜索有关如何部署和运行 RESTEasy JAX-RS 测试应用程序的工作解决方案。 它必须至少在 Java 11 和 Tomcat 10.1 上运行,使用最实际的 JAX-RS 和 RESTEasy 版本。

无论我尝试如何启动并运行它,每个 URL 调用 - 例如 - http://localhost:8080/NetworkManagement/network-management/configurations 以错误 404 结束。

请问有人可以给我一个提示或解决方案吗?

自上次实际尝试使用的代码片段将发布在下一篇文章中 - Eclipse 22.06 maven 项目:

pom.xml

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>ParentServer</artifactId>
        <groupId>com.gncc.srv</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>api.rest</artifactId>
    <packaging>war</packaging>
    <name>GNCC Base Rest Api Server</name>
    <!-- FIXME change it to the project's website -->
    <url>http://localhost:8080</url>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <swagger-core-version>2.0.9</swagger-core-version>
        <jackson-version>2.11.2</jackson-version>
        <jetty-version>9.2.9.v20150224</jetty-version>
        <resteasy-version>3.15.3.Final</resteasy-version>
        <resteasy-servlet>6.2.2.FINAL</resteasy-servlet>
        <slf4j-version>1.6.3</slf4j-version>
        <junit-version>4.13.1</junit-version>
        <servlet-api-version>4.0.4</servlet-api-version>
        <jakarta-annotation-version>1.3.5</jakarta-annotation-version>
        <beanvalidation-version>2.0.2</beanvalidation-version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>${resteasy-version}</version>
        </dependency>

        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxb-provider</artifactId>
            <version>${resteasy-version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-servlet-initializer</artifactId>
            <version>${resteasy-servlet}</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>NetworkManagement</finalName>
        <pluginManagement>
            <!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

web.xml

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="5.0">
<display-name>Archetype Created Web Application</display-name>
</web-app>

应用程序:

    package com.gncc.srv.api.rest;

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

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

import com.gncc.srv.api.rest.service.ConfigurationResource;

@ApplicationPath("/network-management")
public class NetworkManagement extends Application {

    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> empty = new HashSet<Class<?>>();

    public NetworkManagement() {
        singletons.add(new ConfigurationResource());
    }

    @Override
    public Set<Class<?>> getClasses() {
        return empty;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }}

资源.类

    package com.gncc.srv.api.rest.service;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Link;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import com.gncc.srv.api.rest.dao.ConfigurationDB;
import com.gncc.srv.api.rest.domain.Configuration;
import com.gncc.srv.api.rest.domain.Configurations;
import com.gncc.srv.api.rest.domain.common.Message;
import com.gncc.srv.api.rest.domain.common.Status;

/**
* This REST resource has common path "/configurations" and
* represents configurations collection resources 
* as well as individual collection resources.
*
* Default MIME type for this resource is "application/XML"
* */
@Path("/configurations")
@Produces("application/xml")
public class ConfigurationResource
{
    /**
    * Initialize the application with these two default configurations
    * */
    static {
        ConfigurationDB.createConfiguration("Some Content", Status.ACTIVE);
        ConfigurationDB.createConfiguration("Some More Content", Status.INACTIVE);
    }
    
    /**
    * Use uriInfo to get current context path and to build HATEOAS links
    * */
    @Context
    UriInfo uriInfo;

    /**
    * Get configurations collection resource mapped at path "HTTP GET /configurations"
    * */
    @GET
    public Configurations getConfigurations() {

        List<Configuration> list = ConfigurationDB.getAllConfigurations();

        Configurations configurations = new Configurations();
        configurations.setConfigurations(list);
        configurations.setSize(list.size());

        //Set link for primary collection
        Link link = Link.fromUri(uriInfo.getPath()).rel("uri").build();
        configurations.setLink(link);

        //Set links in configuration items
        for(Configuration c: list){
        Link lnk = Link.fromUri(uriInfo.getPath() + "/" + c.getId()).rel("self").build();
        c.setLink(lnk);
        }
        return configurations;
    }

    /**
    * Get individual configuration resource mapped at path "HTTP GET /configurations/{id}"
    * */
    @GET
    @Path("/{id}")
    public Response getConfigurationById(@PathParam("id") Integer id){
        Configuration config = ConfigurationDB.getConfiguration(id);

        if(config == null) {
            return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND)
                    .build();
        }

        if(config != null){
            UriBuilder builder = UriBuilder.fromResource(ConfigurationResource.class)
                        .path(ConfigurationResource.class, "getConfigurationById");
            Link link = Link.fromUri(builder.build(id))
                    .rel("self")
                    .build();
            config.setLink(link);
        }

        return Response.status(javax.ws.rs.core.Response.Status.OK)
                .entity(config)
                .build();
    }

    /**
    * Create NEW configuration resource in configurations collection resource
    * */
    @POST
    @Path("/")
    @Consumes("application/xml")
    public Response createConfiguration(Configuration config){
        if(config.getContent() == null) {
            return Response.status(javax.ws.rs.core.Response.Status.BAD_REQUEST)
                    .entity(new Message("Config content not found"))
                    .build();
        }

        Integer id = ConfigurationDB.createConfiguration(config.getContent(), config.getStatus());
        Link lnk = Link.fromUri(uriInfo.getPath() + "/" + id).rel("self")
                    .build();
        return Response.status(javax.ws.rs.core.Response.Status.CREATED)
                .location(lnk.getUri())
                .build();
    }

    /**
    * Modify EXISTING configuration resource by it’s "id" at path "/configurations/{id}"
    * */
    @PUT
    @Path("/{id}")
    @Consumes("application/xml")
    public Response updateConfiguration(@PathParam("id") Integer id, Configuration config){

        Configuration origConfig = ConfigurationDB.getConfiguration(id);
        if(origConfig == null) {
            return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND)
                    .build();
        }

        if(config.getContent() == null) {
            return Response.status(javax.ws.rs.core.Response.Status.BAD_REQUEST)
                    .entity(new Message("Config content not found"))
                    .build();
        }

        ConfigurationDB.updateConfiguration(id, config);
        return Response.status(javax.ws.rs.core.Response.Status.OK)
                    .entity(new Message("Config Updated Successfully"))
                    .build();
    }

    /**
    * Delete configuration resource by it’s "id" at path "/configurations/{id}"
    * */
    @DELETE
    @Path("/{id}")
    public Response deleteConfiguration(@PathParam("id") Integer id){

        Configuration origConfig = ConfigurationDB.getConfiguration(id);
        if(origConfig == null) {
            return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND).build();
        }

        ConfigurationDB.removeConfiguration(id);
        return Response.status(javax.ws.rs.core.Response.Status.OK).build();
    }
}
maven jax-rs java-11 resteasy tomcat10
1个回答
2
投票

您的 RESTEasy 依赖项看起来不正确。您混合了两个不同版本的 RESTEasy,这是行不通的。如果您使用 Tomcat 10 使用的 Jakarta EE 9+,则需要使用 6.2.2.Final。您的依赖项应该看起来更像:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>${resteasy-version}</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-core</artifactId>
    <version>${resteasy-version}</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxb-provider</artifactId>
    <version>${resteasy-version}</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-servlet-initializer</artifactId>
    <version>${resteasy-version}</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.