使用Resteasy框架编写Web服务。
如果在服务器上处理时抛出任何异常,则需要使用HTTP 500响应向客户端发送错误消息。
我在WebService接口中有void方法:
public interface WebLocationService {
@DELETE
@Path("/delete")
@Consumes(MediaType.APPLICATION_JSON)
public void deleteLocation(LocationId locationId); { }
如果此方法抛出任何异常,则ExceptionMapper捕获它并返回响应,其中500状态和异常消息为实体。
public class WebApplicationExceptionMapper implements
ExceptionMapper<WebApplicationException>{
@Override
public Response toResponse(WebApplicationException e) {
return Response.serverError().entity(e.getMessage()).build();
} }
使用Resteasy客户端代理框架。
对于具有500状态的响应,客户端代理框架抛出ServerErrorException并使用它包装响应。从ServerErrorException获取响应。当我在响应时调用readEntity或getEntity时,它会抛出带有IllegalStateException的Response close错误。
调试它并找出,基于Web服务接口方法返回类型,代理框架决定EntityExtractor。
1)对于void返回类型,DefaultEntityExtractor $ 3缓冲实体输入流,然后关闭响应。
2)对于Response,Response.Status和ResponseObject,DefaultEntityExtractor $ 1,$ 2,$ 4不会关闭响应。
3)对于任何其他类型,BodyEntityExtractor是实体提取器,不会关闭响应。