0

私は現在トレーニング中で、RESTEasy API を使用する Android アプリケーションに取り組んでおり、ProxyFactory.create メソッド (...、...) で問題が発生しました。

説明させてください:

2 つの REST サービスがあります。

AuthenticateService :

    @Path("/authent/tokens")
    public interface AuthenticateService {

    // This method add a data "token" in cookie    
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public PostCustomerOutput createToken(PostCustomerInput postCustomerInput) throws ConnectException;

    @Path("/{id}")
    @DELETE
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Void deleteToken(@PathParam("id") String token);
}

登録サービス:

 @Path("/enrollment/otp")
    public interface UserEnrollmentService {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public PostGenerateOTPOutput postGenerateOTP(PostGenerateOTPInput postGenerateOTPInput);

    @POST
    @Path("/check")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public OutputImpl postCheckOTP(PostCheckOTPInput postCheckOTPInput);
}

これら 2 つのサービスには、Cookie で復元されたデータを処理するインターセプターがあります。

GrantAccessInterceptor :

public class GrantAccessInterceptor extends AbstractInDatabindingInterceptor {
    public GrantAccessInterceptor() {
        super(Phase.USER_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
    HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);

    if (null != request) {
        // Read http header to get cookie/
        Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cook : cookies) {
                    if (cook.getName().equals("token")) {
                        log.info("Token find in cookies");
                        // TODO : do what I want with the cookie
                    }
                }
            } else {
                log.info("Cookies are empty !");
            }
        } 
    }
}

今、私は次のテストを書きました:

@org.junit.Test
public void testCreateToken() {

    RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
    // Recover AuthenticateService 
    AuthenticateService authenticateService = ProxyFactory.create(AuthenticateService.class, urlLocal, executor);
    // Recover UserEnrollmentService 
    UserEnrollmentService userEnrollmentService = ProxyFactory.create(UserEnrollmentService.class, urlLocal, executor);

    PostCustomerInput in = new PostCustomerInput();
    // put data in PostCustomerInput
    PostCustomerOutput out = authenticateService.createToken(in);
    // authenticateService.deleteToken(out.getCustomerToken());
    PostGenerateOTPInput postGenerateOTPInput = new PostGenerateOTPInput();
    userEnrollmentService.postGenerateOTP(postGenerateOTPInput);
}

メソッドを呼び出すと、authenticateService.createTokenGrantAccessInterceptorCookie が空です!」という正しいメッセージが表示されます。Cookie が createToken メソッドに追加されるため、これは正常です。deleteTokenここで、同じサービス(AuthenticateService)でメソッドを呼び出すと、「Token find in cookies」というメッセージが表示されますが、これは問題ありません。

それまではすべて順調です。

ここで、メソッド createToken を呼び出した後AuthenticateServiceに UserEnrollmentService のメソッドを呼び出した場合、GrantAccessInterceptor は Cookie に何も検出されません ... -> 「Cookie が空です!」

ProxyFactory問題は、異なるサービス間で Cookie を共有しないことにあると思います。

4

1 に答える 1