복붙노트

[SPRING] 스프링 부트 1.5.2를 사용하여 Jersey 엔드 포인트 인터페이스의 구현을 삽입하는 방법?

SPRING

스프링 부트 1.5.2를 사용하여 Jersey 엔드 포인트 인터페이스의 구현을 삽입하는 방법?

Spring Boot 1.5.2에서 Jersey 웹 서비스 만이 될 웹 서비스를 포함하는 대형 웹 애플리케이션을 축소하고 있습니다. 웹 서비스에는 이미 Apache Wink에서 구현 된 완전한 JAX-RS 주석 세트가 있으므로 Spring Rest 대신 Spring + Jersey를 사용하기로 결정했습니다. 이 스프링 - 저지 - 샘플 응용 프로그램이 참조로 사용되는 것을 발견했습니다. 현재 작업하고있는 애플리케이션과 샘플의 가장 큰 차이점은 내 엔드 포인트 정의가 인터페이스와 구현으로 나뉘어져 있다는 것입니다.

내 pom.xml 다음 추가 :

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

저의 새로운 Jersey Config는 다음과 같습니다 :

package com.example.configuration;

import org.glassfish.jersey.server.ResourceConfig;
import com.example.EndpointImpl;
import org.springframework.stereotype.Component;

@Component
public class JerseyConfiguration extends ResourceConfig {
  public JerseyConfiguration() {
    registerEndpoints();
  }

  private void registerEndpoints() {
    register(EndpointImpl.class);     
  }
}

그럼 다음 Application.java 있습니다 :

package com.example;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer{
  public static void main(String[] args) {
    new Application().configure(new SpringApplicationBuilder(Application.class)).run(args);
  }
}

엔드 포인트는 다음과 같이 인터페이스와 구현으로 정의됩니다 (빼기).

public interface Endpoint {
  @GET
  @Produces({MediaType.APPLICATION_JSON})
  public Response getHello(@Context ServletContext sc, @Context HttpServletRequest req, @Context HttpHeaders httpHeaders) ;
}
@Path("")
@Component
public class EndpointImpl implements Endpoint {
  @Override
  public Response getHello(@Context ServletContext sc, @Context HttpServletRequest req,
      @Context HttpHeaders httpHeaders)  {
      return Response.ok("hello").build();
  }
}

애플리케이션을 시작할 때 매핑 서블릿 'com.example.configuration.JerseyConfiguration'을 [/ *]로 보내는 메시지를 포함하여 Tomcat이 시작되었다는 메시지가 표시됩니다. 그러나 웹 브라우저로 갈 때 404 Not Found 오류가 발생합니다. GET 정의가 선택되는 것처럼 보이지 않습니다.

해결법

  1. ==============================

    1.이 문제는 § 3.6 Annotation Inheritance의 JAX-RS 스펙에서 설명합니다.

    이 문제는 § 3.6 Annotation Inheritance의 JAX-RS 스펙에서 설명합니다.

    중요한 항구를 강조했습니다. 왜 그것이 당신을 위해 일하지 않는지 분명해야합니다. EndpointImpl에서 @Context 어노테이션을 반복했기 때문에 "수퍼 클래스 또는 인터페이스 메소드의 모든 주석이 무시됩니다." 여기에는 @GET이 포함됩니다. 결국 궁극적으로 엔드 포인트에 @METHOD가 필요하므로 엔드 포인트가 등록되지 않습니다.

    blockquote의 마지막 단락까지, 당신은 그것을 따를 것인지의 여부를 선택할 수 있습니다. 나는 방금 그것을 완전성을 위해 던져 넣었다.

  2. ==============================

    2.당신의 application.yml (.properties)은 어떻게 생겼을까요?

    당신의 application.yml (.properties)은 어떻게 생겼을까요?

    Spring MVC 디스패처 서블릿 용과 Jersey 디스패처 서블릿 용으로 두 개의 경로 매핑을 선언해야 할 수도 있습니다. 같은 것 :

    application.yml

    ...
    # Spring MVC dispatcher servlet path. Needs to be different than Jersey's to enable/disable Actuator endpoints access (/info, /health, ...)
    server.servlet-path: /
    # Jersey dispatcher servlet
    spring.jersey.application-path: /api
    ...
    

    이제 / api / .....에서 Jersey 엔드 포인트에 액세스 할 수 있어야합니다.

    나는 2016 년 4 월에 다시 게시 한 블로그 게시물에서 이것을 다뤘습니다 : Spring Boot, Jersey, Swagger 및 Docker를 사용하는 마이크로 서비스

  3. ==============================

    3.더 최근의 Spring Boot / Spring MVC + Jersey 버전에서 무엇인가가 변경되지 않았다면 Jersey의 Endpoint를 인식하도록 Spring Boot를 얻으려면 Jersey의 ResourceConfig를 확장하는 추가 @Component로 이것을 등록해야합니다 :

    더 최근의 Spring Boot / Spring MVC + Jersey 버전에서 무엇인가가 변경되지 않았다면 Jersey의 Endpoint를 인식하도록 Spring Boot를 얻으려면 Jersey의 ResourceConfig를 확장하는 추가 @Component로 이것을 등록해야합니다 :

    @Component
    public class JerseyExampleConfig extends ResourceConfig {
    
        public JerseyExampleConfig() {
            register(EndpointImpl.class);
        } 
    }
    
  4. from https://stackoverflow.com/questions/43266904/how-to-use-spring-boot-1-5-2-to-inject-implementations-of-jersey-endpoint-interf by cc-by-sa and MIT license