私は現在トレーニング中で、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.createToken
「GrantAccessInterceptor
Cookie が空です!」という正しいメッセージが表示されます。Cookie が createToken メソッドに追加されるため、これは正常です。deleteToken
ここで、同じサービス(AuthenticateService)でメソッドを呼び出すと、「Token find in cookies」というメッセージが表示されますが、これは問題ありません。
それまではすべて順調です。
ここで、メソッド createToken を呼び出した後AuthenticateService
に UserEnrollmentService のメソッドを呼び出した場合、GrantAccessInterceptor は Cookie に何も検出されません ... -> 「Cookie が空です!」
ProxyFactory
問題は、異なるサービス間で Cookie を共有しないことにあると思います。