2012-10-22 4 views
0

예를 일반적인 작업을 수행하는 방법 :JSON - 요청 및 응답에 코드 # 1의

@POST 
@Path("/foo") 
@Consumes({ MediaType.APPLICATION_JSON }) 
public SomeClassA foo(SomeOtherClassB input, @Context HttpServletResponse response, @Context HttpServletRequest request) { 

    takeSomethingFromRequestAndPutOnResponseHeader(response, request); 

    //... do more logic actions 

    return x; 
} 

@POST 
@Path("/bar") 
@Consumes({ MediaType.APPLICATION_JSON }) 
public SomeClassC bar(SomeOtherClassD input, @Context HttpServletResponse response, @Context HttpServletRequest request) { 

    takeSomethingFromRequestAndPutOnResponseHeader(response, request); 

    //... do more logic actions 

    return y; 
} 

당신은 우리가 다른 API 방법을 많이 가지고 있고, 각 API에 우리가 요청 및 응답 주입이 필요 볼 수 있듯이 따라서 우리는 과 동일한 조치를 취할 수 있습니다.

그래서 질문은 :이 코드를 어떻게 한 번만 쓸 수 있습니까?
* 그래서, 우리는 우리가 방법을마다
takeSomethingFromRequestAndPutOnResponseHeader(response, request);

이 실행 할 필요가 없습니다 것입니다, 그래서 * @Context HttpServletResponse response, @Context HttpServletRequest request

의 라인을 각 방법에 쓸 필요하지 않습니다 주로 누군가가 이것을 잊어 버리는 경우입니다 ...

그 이유는 우리가 여러 서버에서 실행되는 API를 가지고 있기 때문에 응답으로 헤더 (요청에서)를 추가하여 다른 헤더를 쉽게 디버깅 할 수 있기 때문입니다. 환경.

고마워,
우리. 우리가하고 싶은 무엇

은 다음과 같습니다

@POST 
@Path("/foo") 
@Consumes({ MediaType.APPLICATION_JSON }) 
public SomeClassA foo(SomeOtherClassB input) { 
    //... do more logic actions 
    return x; 
} 

@POST 
@Path("/bar") 
@Consumes({ MediaType.APPLICATION_JSON }) 
public SomeClassC bar(SomeOtherClassD input) { 
    //... do more logic actions 
    return y; 
} 

이 일단 다른 곳 작성된다.

@Context HttpServletResponse response, @Context HttpServletRequest request 
takeSomethingFromRequestAndPutOnResponseHeader(response, request); 
+0

무엇이 문제입니까 ?? 나는 정확히 당신의 요구 사항을 이해하지 못한다. – Sikorski

답변

1

HttpServletResponse/HttpServletRequest 필드를 표시하고 주석을 달아 클래스 수준에서 HttpServletResponse 및 HttpServletRequest를 삽입 할 수 있습니다. 예를 들면 :

class MyResource { 
@Context 
private HttpServletResponse response; 
@Context 
private HttpServletRequest request; 
..... 
//API methods below..... 

} 

당신이 명시 적으로 API 메소드에 인수로 요청 및 응답을 통과 할 필요가 없습니다 이쪽으로.

+0

Yep :) 모든 리소스에 대해 기본 클래스를 생성하고 모두에게 응답 및 요청을 보냈습니다.
미해결 된 한 가지 문제 - 'aspectS를 사용하여 완료 - 모든 API 호출에'takeSomethingFromRequestAndPutOnResponseHeader (response, request);를 적용하는 방법은 없지만 ... – urir

+0

두 번째 문제를 해결하려면 Friso가 제안한 사항을 살펴보고 필터를 사용해보십시오. 'takeSomethingFromRequestAndPutOnResponseHeader'를 수행하는 필터를 구현할 것입니다. 필터의 doFilter 메소드는 요청과 응답을 전달받습니다 ... 그런 다음 필터를 web.xml의 리소스에 매핑하면 요청이 API 메소드 중 하나를 히트하면 필터가 컨테이너에 의해 호출됩니다 – nstehr

1

이이 모든 API 메소드에 대해, 왜 아닌 http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html를 사용하려면?

이것은 요청 및 응답을 주입하지 않지만 takeSomethingFromRequestAndPutOnResponseHeader (응답, 요청)가 호출 된 후에는 필요하지 않을 수도 있습니다.

+0

고마워, 좋은 생각인데, 첫 번째 옵션이'HttpServletRequest'를 주입하는 동안 필터는'ServletRequest'에 대해 작동한다. 차이점은'HttpServletRequest'는'ServletRequest'가 가지고 있지 않은'getRequestURL()'메소드를 가지고 있습니다. 우리는 그것을 필요로합니다. – urir

+0

ServletRequest를 HttpServletRequest로 쉽게 캐스팅 할 수 있으며 실제로는 항상 그렇게 될 것입니다. – Friso

+0

내가 할 수있을 거라 생각했는데 ... 뭔가 캐스팅에 실패했다.'HttpServletRequest ServletRequest'를 확장하고 내가 얻는 인스턴스가'ServletRequest' ... 그래서 ... 이것이 좋은지 확실하지 않다 ... – urir