GET methods fail to serve requests without Content-Type if the class/interface
has @Consumes
--------------------------------------------------------------------------------------------
Key: WINK-286
URL: https://issues.apache.org/jira/browse/WINK-286
Project: Wink
Issue Type: Bug
Components: Server
Affects Versions: 1.1
Reporter: Raymond Feng
When the JAX-RS resource (the method with @GET) is accessed from a web browser,
the Content-Type is not set and it's default to application/octet-stream. Wink
fails to match to the method as it inherits @Consumes (say, application/json)
from the class/interface and it is not compatible with
application/octet-stream. For example:
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface Catalog {
@GET
List<Item> get();
@GET
@Path("{id}")
Item get(@PathParam("id") String id);
}
The GET method doesn't have the request entity. Why do we need to compare the
media type for the request? I assume we should only check the methods that take
the HTTP body.
I had to work around this issue for Tuscany to add */* or
application/octet-stream to the GET method's consumes set. It's ugly :-(.
private synchronized void fixMediaTypes(DeploymentConfiguration config) {
if (fixed) {
return;
}
// FIXME: A hacky workaround for
https://issues.apache.org/jira/browse/TUSCANY-3572
ResourceRecord record =
config.getResourceRegistry().getRecord(resourceClass);
for (MethodMetadata methodMetadata :
record.getMetadata().getResourceMethods()) {
String method = methodMetadata.getHttpMethod();
if (HttpMethod.GET.equals(method) || HttpMethod.HEAD.equals(method)
|| HttpMethod.DELETE.equals(method)) {
methodMetadata.addConsumes(MediaType.APPLICATION_OCTET_STREAM_TYPE);
methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
}
if (HttpMethod.HEAD.equals(method) ||
HttpMethod.DELETE.equals(method)) {
methodMetadata.addProduces(MediaType.APPLICATION_OCTET_STREAM_TYPE);
methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
}
}
for (MethodMetadata methodMetadata :
record.getMetadata().getSubResourceMethods()) {
String method = methodMetadata.getHttpMethod();
if (HttpMethod.GET.equals(method) || HttpMethod.HEAD.equals(method)
|| HttpMethod.DELETE.equals(method)) {
methodMetadata.addConsumes(MediaType.APPLICATION_OCTET_STREAM_TYPE);
methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
}
if (HttpMethod.HEAD.equals(method) ||
HttpMethod.DELETE.equals(method)) {
methodMetadata.addProduces(MediaType.APPLICATION_OCTET_STREAM_TYPE);
methodMetadata.addConsumes(MediaType.WILDCARD_TYPE);
}
}
fixed = true;
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.