2016-08-22 5 views
2

@With 주석 스타일과 함께 사용할 수있는 동작을 만들고 싶습니다. 이 작업은 RPC 호출로 진행해야하므로 문서를 올바르게 이해하면 비동기 방식으로 처리해야합니다.Java의 Play Framework 2.5에서 동작 구성 및 비동기

public class GetUserIdAction extends play.mvc.Action.Simple { 

    @Override 
    public CompletionStage<Result> call(Http.Context context) { 
    String token = ""; 

    if (StringUtils.isEmpty(token)) { 
     return delegate.call(context); 
    } 

    CompletionStage<Http.Context> promiseOfUpdatedContext = CompletableFuture.supplyAsync(() -> setUserIdForToken(context, token)); 

    return promiseOfUpdatedContext.thenApply(ctx -> delegate.call(ctx)); 
    } 

    private Http.Context setUserIdForToken(Http.Context context, String token) { 
    context.args.put("user_id", authenticationManager.getUserIdForToken(token)); 
    // The AuthenticationManager is issuing an RPC call and thus may take some time to complete. 
    return context; 
    } 
} 
token은 항상 비어 있고 authenticationManager이 설정되지 않은 사실, 이것은 그냥 빨리 의미 예이다 따로 설정

, 내 IDE가에 불평 :

내가 지금까지하려고 노력 무엇인가 thenApply 부분. 내가 이해하는 것을 위해, 그것은 CompletionStage<Result>를 기대하고 있고, 그 이상의 무엇인가 얻는다 CompletionStage<CompletionStage<Result>>.

어떻게 처리 할 수 ​​있습니까? 왜냐하면 여기서 내가 원하는 것은 컨텍스트에 몇 가지 정보를 넣은 다음 delegate.call 체인을 계속 사용하는 것입니다.

어쩌면 내가 어리석은 짓을하고 있으며 구성한 작업이 이미 비동기 적이기도합니다.

답변

1

CompletionStage<Something>이 있고 CompletionStage<Result>으로 끝내고 싶습니다. 이를 달성하는 가장 쉬운 방법은 thenCompose입니다. 여기

작은 변화, 예입니다 : 내가 토큰을 얻을 수있는 CompletableFuture 있습니다 만 그때

@Override 
public CompletionStage<Result> call(final Http.Context context) { 
    final String token = ""; 

    if (StringUtils.isEmpty(token)) { 
     return delegate.call(context); 
    } 

    return CompletableFuture.supplyAsync(() -> { 
     // do something to fetch that token 
     return "your_new_token"; 
    }).thenCompose(tokenReceived -> { 
     context.args.put("user_id", tokenReceived); 
     return delegate.call(context); 
    }); 
} 
+0

당신을 감사합니다 HttpContext를에 추가 대단히 지금 작동한다! –