JAX-RS不适用于Spring Boot 1.4.1

JAX-RS不适用于Spring Boot 1.4.1,第1张

JAX-RS不适用于Spring Boot 1.4.1

重要提示: 看来最新版本的Spring Boot中没有这个问题。但是,当您要使用Spring
Boot和Jersey创建应用程序时,此答案的内容仍可以用作指导。


在Spring Boot 1.4.1中更改了JAR的布局

可执行jar的布局在Spring Boot 1.4.1中已更改:现在将应用程序的依赖项打包

BOOT-INF/lib
而不是中
lib
,并且将应用程序自己的类打包在
BOOT-INF/classes
jar的根中。它影响泽西岛:

Jersey类路径扫描限制

可执行jar布局的更改意味着,Jersey的类路径扫描中的限制现在会影响可执行jar文件以及可执行war文件。要变通解决此问题,您希望Jersey扫描的类应打包在一个jar中,并作为一个依赖项包含在中

BOOT-INF/lib
。然后,应将Spring Boot启动器配置为在启动时解压缩这些jar,以便Jersey可以扫描其内容。

我发现注册类而不是包是可行的。请参阅以下步骤,使用Spring Boot和Jersey创建应用程序。

使用Spring Boot和Jersey创建一个Web应用程序

确保您的

pom.xml
文件声明
spring-boot-starter-parent
为父项目:

<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>1.4.1.RELEASE</version></parent>

您还需要以下依赖项:

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-jersey</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-test</artifactId>        <scope>test</scope>    </dependency>    <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <scope>test</scope>    </dependency></dependencies>

还有Spring Boot Maven插件:

<build>    <plugins>        <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId>        </plugin>    </plugins></build>

出于示例目的,创建带有批注的Jersey资源类,

@Path
并定义用于处理
GET
请求的资源方法,产生
text/plain

@Path("/greetings")public class GreetingResource {    @GET    @Produces(MediaType.TEXT_PLAIN)    public Response getGreeting() {        return Response.ok("Hello, World!").build();    }}

然后创建一个扩展

ResourceConfig
Application
注册Jersey资源的类,并用对其进行注释
@ApplicationPath
。使用Spring
Boot 1.4.1可以注册类而不是注册软件包:

@Component@ApplicationPath("api")public class JerseyConfig extends ResourceConfig {    @PostConstruct    private void init() {        registerClasses(GreetingResource.class);    }}

最后创建一个Spring Boot类来执行应用程序:

@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

如果要测试此Web服务,可以使用JAX-RS Client
API

@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)public class GreetingResourceTest {    @LocalServerPort    private int port;    private URI uri;    @Before    public void setUp() throws Exception {        this.uri = new URI("http://localhost:" + port);    }    @Test    public void testGreeting() {        Client client = ClientBuilder.newClient();        Response response = client.target(uri).path("api").path("greetings") .request(MediaType.TEXT_PLAIN).get();        String entity = response.readEntity(String.class);        assertEquals("Hello, World!", entity);    }}

要编译和运行该应用程序,请按照下列步骤 *** 作:

  • 打开命令行窗口或终端。
  • 导航到项目所在的根目录
    pom.xml
  • 编译项目:
    mvn clean compile
  • 打包应用程序:
    mvn package
  • 在目标目录中查找。您应该看到一个具有以下名称或类似名称的文件:
    spring-jersey-1.0-SNAPSHOT.jar
  • 切换到目标目录。
  • 执行JAR :
    java -jar spring-jersey-1.0-SNAPSHOT.jar
  • 该应用程序应该位于
    http://localhost:8080/api/greetings

注意1: 请查看Spring Boot文档。有专门针对泽西岛的部分。

注意2:
产生JSON时,请确保您已注册JSON提供程序。

ResourceConfig
不过应该注意这一点(只需确保依赖项在类路径上)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5011971.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存