wadl2java生成的客户端在成功的帖子和put上抛出UniformInterfaceException

时间:2014-09-23 09:03:39

标签: java jersey jersey-client wadl

以下是使用GlassFish wadl2java工具

生成的代码示例
public com.sun.jersey.api.client.ClientResponse putXmlAsClientResponse(com.client.BedOrder input) {
                UriBuilder localUriBuilder = _uriBuilder.clone();
                com.sun.jersey.api.client.WebResource resource = _client.resource(localUriBuilder.buildFromMap(_templateAndMatrixParameterValues));
                com.sun.jersey.api.client.WebResource.Builder resourceBuilder = resource.getRequestBuilder();
                resourceBuilder = resourceBuilder.type("application/xml");
                com.sun.jersey.api.client.ClientResponse response;
                response = resourceBuilder.method("PUT", com.sun.jersey.api.client.ClientResponse.class, new JAXBElement(new QName("", "bedOrder"), com.client.BedOrder.class, input));
                if (response.getStatus()>= 400) {
                    throw new OrderEntryFapi.WebApplicationExceptionMessage(javax.ws.rs.core.Response.status(response.getClientResponseStatus()).build());
                }
                return response.getEntity(com.sun.jersey.api.client.ClientResponse.class);
            }

每当我使用生成的方法发布或放置方法时抛出UniformInterfaceException。这样做的原因是每个方法都返回一个ClientResponse对象,该对象应该可以正常工作。但是,在getEntity

的情况下,方法调用204 No Content Status code而不是返回响应对象本身。

除了手动修改生成的代码,以便如果响应的状态代码202我返回response而不是response.getEntity(com.sun.jersey.api.client.ClientResponse.class)我该怎么办?

基本上我希望包含204的特殊情况的所有请求看起来像这样:

if (response.getStatus() == 204) {
    return response;
}

1 个答案:

答案 0 :(得分:1)

在你的WADL中,定义错误状态以及你期望这些类型的内容。

<wadl:response status="200 204">
    <wadl:representation mediaType="application/xml"
    element="xs:SuccessResponse" />
</wadl:response>

<wadl:response status="400 401 406 415">
    <wadl:representation mediaType="application/xml"
    element="xs:ErrorResponse" />
</wadl:response>

这会将生成的代码更改为:

switch (response.getStatus()) {
    case  400 :
    case  401 :
    case  406 :
    case  415 :
        throw new ErrorResponseException(response, response.getEntity(ErrorResponse.class));
    default:
        if (!com.sun.jersey.api.client.ClientResponse.class.isAssignableFrom(returnType)) {
            if (response.getStatus()>= 400) {
                throw new OrderEntryFapi.WebApplicationExceptionMessage(Response.status(response.getClientResponseStatus()).build());
                }
            }
        }