2016-10-21 1 views
0

에 매개 변수를 전달하는 방법, 나는 다음과 같은 상황이 :JEE : 글래스 피쉬 3에서 실행, 내 JEE 응용 프로그램에서 인터셉터

MyFacade 클래스

@Interceptors(SomeInterceptor.class) 
public void delete(Flag somethingForTheInterceptor, String idToDelete) { 
    ....... 
} 

@Interceptors(SomeInterceptor.class) 
public void update(Flag somethingForTheInterceptor, MyStuff newStuff) { 
    ....... 
} 

변수 somethingForTheInterceptor가에서 사용되지 않습니다 이러한 방법은, 그것은 단지 인터셉터에 사용됩니다

SomeInterceptor 클래스

@AroundInvoke 
public Object userMayAccessOutlet(InvocationContext ctx) throws Exception { 
    Flag flag = extractParameterOfType(Arrays.asList(ctx.getParameters()), Flag.class); 
    // some checks on the flag 
} 

어쨌든 메서드에 사용되지 않은 매개 변수를 사용하는 것이 좋지 않습니다. 인터셉터에 somethingForTheInterceptor을 "보내는"다른 방법이 있습니까?

UPDATE : delete()update()의 발신자는 somethingForTheInterceptor 변수를 계산하는 다양한 방법이있다. 그리고 이것은 상수가 아닙니다. 이를 계산하는 데 필요한 정보는 REST 호출에 있습니다. 그러나 2 개의 REST 메소드는 서로 다른 입력 객체를 가지므로 http 요청을 주입하기에 충분하지 않습니다. 자원의 방법은 상황에 어떤 종류의 플래그를 설정하는 것이 가능하다, 즉 수 있습니다 -

에서는 MyResource 클래스는

@DELETE 
@Path("/delete/{" + ID + "}") 
public Response delete(@PathParam(ID) final String id) { 
    Flag flag = calculateFlagForInterceptor(id); 
    facade.delete(flag, id); 
} 

@POST 
@Path("/update") 
@Consumes(MediaType.APPLICATION_JSON + RestResourceConstants.CHARSET_UTF_8) 
public Response update(final WebInputDTO updateDetails) throws ILeanException { 
    Flag flag = calculateFlagForInterceptor(updateDetails); 
    facade.update(flag, convertToMyStuff(updateDetails)); 
} 
내가 생각

:

는 발신자입니다 나중에 인터셉터에 주입 되었습니까?

+0

이 플래그 값이 될 수있는 무엇 : 인터셉터 책임을 강화하여 교통에 이상 anly 플래그가 필요하지 않은 것? 주석에서 상수 일 수 있습니까? 이 깃발의 필요성을 설명해 주시겠습니까? – AxelH

답변

1

Java EE에서 인터셉터는 메소드에 사전 및 사후 처리를 추가 할 수있게합니다. 따라서 인터셉터 실행의 컨텍스트는 메소드의 컨텍스트입니다.

내가 생각 - 자원의 방법 이 상황에 어떤 종류의 플래그를 설정하는 것이 가능하며, 그 이후 인터셉터에 주입 될 수 있는가?

Staless 서비스는 필요할 때 권한이 있어야합니다. 따라서 서버 (ThreadLocal, Session 등)에 데이터를 저장하지 않아야합니다.

계산에 필요한 정보는 REST 호출시 입니다.

왜? 휴식 컨트롤러에는 계산 및 논리를 수행 할 직업이 없습니다.

문제를 해결하려면 인터셉터에서 플래그 계산을 옮길 수 없었습니까?

@AroundInvoke 
public Object userMayAccessOutlet(InvocationContext ctx) throws Exception { 
    Flag flag = calculFlag(Arrays.asList(ctx.getParameters())); 
    // some checks on the flag 
} 
+0

대체 솔루션으로 단점이 발생할 수 있음을 지적하면서이 답변을 수락했습니다.최선의 해결책은 인터셉터에'calculateFlag()'메소드를 구현하는 것이고, 이것은 불가능하지 않습니다. – user1414745

+0

당신은 오신 것을 환영합니다. 이 경우 인터셉터는 사용자의 필요를 충족시키는 데 가장 적합한 패턴이 아닐 수 있습니다. – davidxxx

관련 문제