[
https://issues.apache.org/jira/browse/CXF-6437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Serhiy Yakovyn updated CXF-6437:
--------------------------------
Description:
@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
was:
@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:
@PUT
@Path("\{id\}/info")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
void setInfo(@PathParam("id") String documentId, StorageObject newInfo);
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
> @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)