我有一个带有以下方法代码的Web服务:
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为true,则postMethod1方法将阻塞,等待有人调用postMethod2。
如果有人致电postMethod2(从CE致电postMethod1不到1分钟)。 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);
那么可能是什么问题呢?
最佳答案
我不知道该怎么用您的脚本语言来做,但是内容类型text/html
是错误的。
我也不确定这是响应还是请求部分,但它不匹配或未正确设置APPLICATION_JSON
。
您应该可以通过调查实际的网络流量来轻松解决此问题(为此我使用ngrep
,但其他人更喜欢tcpdump
)。
关于java - 为什么RESTful Web服务不能正确调用semaphore.acquire()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52650540/