You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (JIRA)" <ji...@apache.org> on 2015/06/04 11:33:38 UTC

[jira] [Commented] (CXF-6437) @Produces has no effect if the annotated method returns void when using ClientProxy

    [ https://issues.apache.org/jira/browse/CXF-6437?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14572445#comment-14572445 ] 

Sergey Beryozkin commented on CXF-6437:
---------------------------------------

Thanks for marking this issue as a Wish because it is indeed not a bug and it works as expected. 
@Produces on the main method is not relevant if 'void' is returned and if you need to return the same object with the error status then the exception mapper needs to set up Content-Type manually.
IMHO it would be cleaner to avoid keeping the same invocation path for error and not error responses, simply introduce say StorageObjectError, return its representation with 401.
If  it can be either XML or JSON then check the input Content-Type (with the injected HttpHeaders) and set it on the response.
Next register ResponseExceptionProvider with the proxy (given that you use a proxy API and a void method) and return BadRequestException from it, catch the exception and do ex.getResponse().readEntity(StorageObjectError.class).
If you do prefer to keep the current style then change 'void' to 'Response'



> @Produces has no effect if the annotated method returns void when using ClientProxy
> -----------------------------------------------------------------------------------
>
>                 Key: CXF-6437
>                 URL: https://issues.apache.org/jira/browse/CXF-6437
>             Project: CXF
>          Issue Type: Wish
>          Components: JAX-RS
>    Affects Versions: 2.7.16
>            Reporter: Serhiy Yakovyn
>
> @Produces has no effect on CXF if the annotated method returns void. The "accept" is set to default "\*/\*".
> Though it looks right for successful calls of the method, it starts causing issues when there are different type of responses in case of an error.
> For example:
> {code}
>  @PUT
>  @Path("{id}/info")
>  @Consumes(MediaType.APPLICATION_JSON)
>  @Produces(MediaType.APPLICATION_JSON)
>  void setInfo(@PathParam("id") String documentId, StorageObject newInfo);
> {code}
> No response is expected on success.
> However when the passed StorageObject contains some invalid data the server responds with "HTTP/1.1 400 Bad Request" and the body contains detailed information about which fields contain invalid values.
> That information can be send either as JSON or as XML data, but I cannot make CXF to specify which format I want the error to be sent in.
> The issue is in
> org.apache.cxf.jaxrs.client.ClientProxyImpl.setRequestHeaders(MultivaluedMap<String, String>, OperationResourceInfo, boolean, Class<?>, Class<?>)
> method, namely in lines 359-360 (cxf-rt-frontend-jaxrs-2.7.16.jar):
> {code}
>             } else if (responseClass == Void.class || responseClass == Void.TYPE) {
>                 accepts = Collections.singletonList(MediaType.WILDCARD_TYPE);
> {code}
> which I would like to remove.
> As a workaround I'm using my own Void class not to satisfy the above part of the if statement



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)