[
https://issues.apache.org/jira/browse/CXF-5316?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13791861#comment-13791861
]
DUCHEOL KIM commented on CXF-5316:
----------------------------------
Hi Sergey.
I test it using PreMatching ContainerRequestFilter, but it doesn't work.
I write Container fileter like below.
@Provider
@PreMatching
public class TFSMContainerRequestFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext requestContext)
throws IOException {
...
// Check Content-Type and save the version info to version
variable.
if ( version != null ){
MultivaluedMap<String,String> headers =
requestContext.getHeaders();
List<String> contentType = new ArrayList<String>();
contentType.add("application/json+v2");
headers.put(HttpHeaders.CONTENT_TYPE, contentType);
}
....
}
But there request is coming to "application/json" instead of
"application/json+v2".
When I review ContainerRequestContextImpl.getHeaders(), I realize that header
can't be updated by above way.
public class ContainerRequestContextImpl extends AbstractRequestContextImpl
implements ContainerRequestContext {
...
@SuppressWarnings("unchecked")
public MultivaluedMap<String, String> getHeaders() {
h = null;
return new MetadataMap<String, String>(
(Map<String, List<String>>)m.get(Message.PROTOCOL_HEADERS), false,
false, true);
}
}
Could you let me know how I can update headers ( especially Content-Type ) at
ContainerRequestFilter ?
> REST Overriding request URI doesn't change serviceBeans
> -------------------------------------------------------
>
> Key: CXF-5316
> URL: https://issues.apache.org/jira/browse/CXF-5316
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 2.7.6
> Reporter: DUCHEOL KIM
> Assignee: Sergey Beryozkin
>
> Hi All.
> I am writing RESTful API code using CXF.
> For the versioning, we plan to implement based on Content-Type header.
> For this, I'm trying to two ways but both of them aren't work.
> 1. Use different Consumes annotation at same class.
> I try to set different Content-Type at same class, but it always work
> with one method.
> @POST
> @Path("/")
> @Produces("application/json")
> @Consumes("application/json; application,v=2")
> public Response createProjectV2(Person person) {
> ....
> }
> ...
> @POST
> @Path("/")
> @Produces("application/json")
> @Consumes("application/json")
> public Response createProject(Person person) {
> ....
> }
> always "createProject" which has "application/json" on Consumes annotation.
> 2. Update Request URI at interceptor to use different serviceBean for
> differnt version.
> public class CommonInInterceptorImpl implements RequestHandler{
> public Response handleRequest(Message message , ClassResourceInfo
> resourceClass) {
> ...
> String requestUri =
> (String)message.get(Message.REQUEST_URI);
> String basePath =
> (String)message.get(Message.BASE_PATH);
>
> String targetPath =
> basePath+"ver-"+version+"/"+requestUri.substring(basePath.length());
> message.put(Message.CONTENT_TYPE,
> "application/json;application,v=2");
> message.put(Message.REQUEST_URI, targetPath);
> ...
> }
> ....
> Service Bean 1
> @Path(PersonService.PERSON_SERVICE_URL)
> public class PersonService extends RESTApiHandler{
> ...
> }
> Service Bean 2 ( in different package )
> @Path("/ver-2/"+com.tfsm.palette.api.rest.PersonService.PERSON_SERVICE_URL)
> public class PersonService {
> ...
> }
> I update REQUEST_URI at interceptor to redirect request to other serviceBean,
> but request is processed orginal desired serviceBean.
> ( I expect redirect request to 2nd service Bean , but it always processed at
> 1st service Bean. )
> I don't know whether 1st approach is correct in JAX RS spec, but I expect 2nd
> have to be work because it is mentioned at your documentation.
> http://cxf.apache.org/docs/jax-rs-filters.html#JAX-RSFilters-OverridingrequestURI%2Cqueryandheaders
> Could you let me know how we could redirect request to different serviceBean
> ?
--
This message was sent by Atlassian JIRA
(v6.1#6144)