[
https://issues.apache.org/jira/browse/CXF-8119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16940797#comment-16940797
]
Marco Tenti commented on CXF-8119:
----------------------------------
I maybe found a "patch" solution, but i need help to finalize.
I'have tried to customize a cxf inteceptor to capture the value on the body of
the message and try to set on the header of the message.
here a example of the interceptors
{code:java}
public class MessageChangeInterceptor extends AbstractPhaseInterceptor<Message>
{
public MessageChangeInterceptor() {
super(Phase.PRE_STREAM);
}
public MessageChangeInterceptor(String phase) {
super(phase);
}
@Override
public void handleMessage(Message message) throws Fault {
try {
HttpServletRequest httpRequest1 = (HttpServletRequest)
message.get(AbstractHTTPDestination.HTTP_REQUEST);
String method = httpRequest1.getMethod();
//https://stackoverflow.com/questions/9179375/servlet-filter-vs-cxf-interceptor-for-modifying-request-response-content
//https://stackoverflow.com/questions/10743000/how-to-get-parameters-name-and-value-in-requesthandler-of-jax-rs-based-service-i
String queryString = (String)
message.get(Message.QUERY_STRING);
MultivaluedMap<String, String> queryMap =
JAXRSUtils.getStructuredParams(queryString, "&", false, false);
Map<String, List<String>> headers = (Map<String, List<String>>)
message.get(Message.PROTOCOL_HEADERS);
//HOW CAN I PAS THE VALUE TO THE HEADER SO I CAN MAKE WORK
//THE INJECT FOR "javax.ws.rs.core.Context" ?
...
} catch (Exception ce) {
Fault fault = new Fault(ce.getMessage(), Logger.getGlobal());
fault.setStatusCode(Status.INTERNAL_SERVER_ERROR.getStatusCode());
fault.setMessage(ce.getMessage());
throw fault;
}
{code}
It's not a ideal solution, but if anyone know how to do this , i can in the
meanwhile go on with the project.
> Can't Inject "javax.ws.rs.core.Context" annotation with camel blueprint
> -----------------------------------------------------------------------
>
> Key: CXF-8119
> URL: https://issues.apache.org/jira/browse/CXF-8119
> Project: CXF
> Issue Type: Bug
> Components: Bus, Core, JAX-RS, OSGi, Resources
> Affects Versions: 3.2.7
> Reporter: Marco Tenti
> Priority: Major
>
> I have a REST Service project build for a Red Hat Fuse.
> it's a simple set up of a rest service with a "blueprint.xml" and the
> "cxf:rsServer" and it's work just fine.
> But i need to use the @Context annotation of javax.ws.rs and i ca't find a
> way to inject dynamically the @Context on my java class.
> A full project for test of the problem can be found here:
> [bug-load-context-annotation-blueprint|https://github.com/p4535992/bug-load-context-annotation-blueprint]
> My goal is to set the value of the field;
> {code:java}
> @javax.ws.rs.core.Context
> public javax.ws.rs.core.HttpHeaders httpHeaders;
> {code}
> Another strange bug is if i call the method:
> {code:java}
> @GET
> @Path("/ping")
> @Produces(MediaType.APPLICATION_JSON)
> @WebMethod(operationName = "ping")
> @WebResult(name = "Response")
> @ApiResponses(value = {
> @ApiResponse(code = 200, message = "Success") ,
> @ApiResponse(code = 500, message = "Error")
> }
> )
> @ApiOperation( "Get operation with Response and @Default value")
> public Response ping() {
> logger.info("PING SIGNATURE SERVICE");
> return Response.ok().entity("PING SIGNATURE SERVICE").build();
> }
> }
> {code}
> it's work just fine , but if i call this (i just add the @Context HttpHeaders
> httpHeaders parameter on the method) :
> {code:java}
> @GET
> @Path("/ping")
> @Produces(MediaType.APPLICATION_JSON)
> @WebMethod(operationName = "ping")
> @WebResult(name = "Response")
> @ApiResponses(value =
> { @ApiResponse(code = 200, message = "Success") , @ApiResponse(code = 500,
> message = "Error") }
> )
> @ApiOperation( "Get operation with Response and @Default value")
> public Response ping(@Context HttpHeaders httpHeaders)
> { logger.info("PING SIGNATURE SERVICE"); return Response.ok().entity("PING
> SIGNATURE SERVICE").build(); }
> }
> {code}
> i get this error:
> {code}
> 415 Error: Unsupported Media Type
> {code}
> Teh documentation say something about the attribute "propagateContexts" to
> true, but seem do nothing:
> {code:}
> <from id="myRestSereer"
> uri="cxfrs:bean:myRestSereer?performInvocation=true&bindingStyle=SimpleConsumer&propagateContexts=true"/>
> {code}
> ANOTHER example i can't undestand, the first method is injected with succes,
> the second give me the "415 Error: Unsupported Media Type":
> {code:java}
> /**
> * THIS WORK
> */
> @GET
> @Path("/getheader")
> public Response getHeaderDetails(
> @HeaderParam("User-Agent") String userAgent,
> @HeaderParam("Content-Type") String contentType,
> @HeaderParam("Accept") String accept
> ) {
> String header = "User-Agent: " + userAgent +
> "\nContent-Type: " + contentType +
> "\nAccept: " + accept;
> return Response.status(200).entity(header).build();
> }
> /**
> * THIS NOT WORK error "415 Error: Unsupported Media Type"
> */
> @GET
> @Path("/getallheader")
> public Response getAllHeader(@Context HttpHeaders httpHeaders) {
> // local variables
> StringBuffer stringBuffer = new StringBuffer();
> String headerValue = "";
> for(String header : httpHeaders.getRequestHeaders().keySet()) {
> headerValue =
> httpHeaders.getRequestHeader(header).get(0);
> stringBuffer.append(header + ": " + headerValue + "\n");
> }
> logger.info(stringBuffer.toString());
> return
> Response.status(200).entity(stringBuffer.toString()).build();
> }
> {code}
> Anyone know what i'm doing wrong with camel-blueprint?
--
This message was sent by Atlassian Jira
(v8.3.4#803005)