У меня есть веб-сервис со следующим кодом метода:
private static Semaphore reacted = new Semaphore(0);
@Path("/p1")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public UserDefinedClass postMethod1( UserDefinedClass udc) {
If (Condition A)
semaphore.acquire();
System.out.println("Test");
UserDefinedClass u = new UserDefinedClass(udc);
return u;
}
@Path("/p2")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void postMethod2(UserDefinedClass udc) throws IOException {
...
reacted.release();
}
Если условие A не возникает, служба правильно отвечает на вызывающую среду (назовем его CE), однако, если условиеA верно, метод postMethod1 блокирует ожидание того, чтобы кто-нибудь вызвал postMethod2.
Если кто-то вызывает postMethod2 (в течение 1 минуты после вызова CE для postMethod1).postMethod1 разблокируется, однако, код ниже semaphore.acquire ();никогда не выполняется, и сообщение «Тест» не распечатывается. Я получаю следующую ошибку в CE:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=utf-8, type=class...
Обратите внимание, что если условие A не было истинным, ошибка в CE не отображается.Это означает, что проблема не в определении метода, а в том, что поток метода переходит в состояние ожидания в ожидании семафора.
Код CE:
UserDefinedClass udc = new UserDefinedClass();
ClientConfig config = new ClientConfig(JacksonJsonProvider.class);
Client client = ClientBuilder.newClient(config);
String targetUrl = "http://localhost:8080/myApp";
WebTarget target = client.target(targetUrl);
Invocation.Builder invocationBuilder = target.path("rest").
path("p1").
request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.post(Entity.entity(udc, MediaType.APPLICATION_JSON));
UserDefinedClass u = response.readEntity(UserDefinedClass.class);
Так что можетбыть проблемой?!