program story

JAX-RS에 대한 @PATCH 어노테이션을 갖는 방법은 무엇입니까?

inputbox 2020. 11. 21. 14:09
반응형

JAX-RS에 대한 @PATCH 어노테이션을 갖는 방법은 무엇입니까?


JAX-RS에는 GET( @GET) 및 POST( @POST) 같은 HTTP 동사 에 대한 @PATCH어노테이션 이 있지만 어노테이션 이 없습니다 . PATCHHTTP 동사에 대한 주석을 어떻게 가질 수 있습니까?

다음과 같은 것 :

@PATCH
public Response someCode() {
    // Code to handle the request
}

나는 여기에 답을 얻었다 .

사용자 지정 패치 주석을 정의하기 만하면 됩니다. 즉, 다음 코드 PATCH.java 파일 을 작성해야 합니다.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}

PATCH.java가 포함패키지를 가져 오면 다른 HTTP 메서드 주석처럼 사용할 수 있습니다.

@PATCH
@Path("/data/{keyspace}")
@Produces({ "application/json" })
public void patchRow(@PathParam("keyspace") String keyspace, String body) 
throws Exception

이 @PATCH를 사용하여 REST 서비스에 JSON을 전송했습니다.


JAX-RS 2.1을 사용하십니까?

@PATCH지원되는 HTTP 메소드 목록에 JAX-RS 2.1이 추가되었습니다 .

Swagger를 사용하십니까?

Swagger사용하여 REST API를 문서화 할 때 패키지에 @PATCH정의 된 기존 주석을 사용할 수 있습니다 io.swagger.jaxrs.

Jersey와 Dropwizard를 사용하십니까?

Dropwizard패키지에 @PATCH주석을 정의 io.dropwizard.jersey합니다.

직접 작성

위에서 언급 한 접근 방식이 작동하지 않는 경우 고유 한 @PATCH주석을 작성할 수 있습니다 .

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH { }

@HttpMethod주석이 무엇 JAX-RS 사양 통화 작성, 주석으로 HTTP 메소드의 이름을 연결하는 데 사용되는 리소스 방법 부호를 .

자체 @PATCH주석은 Swagger에서 잘 작동합니다 .


Jersey에서는 잘 작동하지만 Jersey Client를 사용하여 리소스 클래스를 테스트 할 때 예외가 발생합니다.

java.net.ProtocolException: Invalid HTTP method: PATCH

클라이언트 속성을 설정하여 이에 대한 해결 방법이 있습니다.

HttpUrlConnectorProvider.SET_METHOD_WORKAROUND 

그러나 기다리면 다음 예외가 발생합니다.

javax.ws.rs.ProcessingException: java.net.ProtocolException: HTTP method PATCH doesn't support output

따라서 Apache HTTP 클라이언트를 사용하도록 쉽게 구성 할 수있는 Jersey 버전 2.10을 사용하여 Apache HTTP 클라이언트 라이브러리로 변경하는 것 외에 다른 방법은 없습니다 JerseyTest..

@Override
protected void configureClient(ClientConfig config) {
  config.register(CustomJacksonJsonProvider.class);
  ConnectorProvider connectorProvider = new ApacheConnectorProvider();
  config.connectorProvider(connectorProvider);
}

그리고 당신은 또 다른 메이븐 종속성을 추가, 필요 jersey-apache-connectorjersey-test-framework-provider-external참조 저지 문서를


JAX-RS API 2.0.1에는 PATCH가 없습니다. 그러나 JAX-RS API 2.2-SNAPSHOT 코드를 살펴보면 PATCH가 포함됩니다. 코드는 다음과 같습니다.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod(HttpMethod.PATCH)
@Documented
public @interface PATCH {
}

여기에 링크가 있습니다.

2.2가 나올 때까지 같은 코드를 구제에 사용할 수 있습니다. HttpMethod.PATCH의 경우 "PATCH"로 바꾸십시오.


If you are using CXF 3.1.2 or later (source), you can use org.apache.cxf.jaxrs.ext.PATCH.

참고URL : https://stackoverflow.com/questions/17897171/how-to-have-a-patch-annotation-for-jax-rs

반응형