2013-03-15 1 views
2

У меня возникают проблемы с установкой Content-Type, когда я выполняю собственный рендеринг внутри CXF (v2.6.3) @WebMethod.Как установить тип содержимого при рендеринге моего собственного ответа в CXF @WebMethod

Следующая модель работает отлично:

@Path("/foo") 
@WebService 
public class FooService { 
    @Path("/bar") 
    @Produces({ "text/plain" }) 
    @GET 
    @WebMethod 
    public String bar() { 
     return "hi"; 
    } 

Это возвращает "hi" к HTTP-клиент с Content-Type: Content-Type: text/plain заголовком, который является то, что я ожидал.

Однако, когда я пытаюсь сделать свой собственный рендеринг с помощью реакции OutputStream, "hi" правильно возвращаются, но @Produces аннотацию игнорируются, и по умолчанию text/xml типа контента возвращается. Это верно, даже если я сам звоню setContentType(...).

@Path("/heartbeat2") 
@Produces({ "text/plain" }) 
@WebMethod 
@Get 
public void heartbeat2() { 
    HttpServletResponse response = messageCtx.getHttpServletResponse(); 
    response.getOutputStream().write("hi".getBytes()); 
    // fails with or without this line 
    response.setContentType("text/plain"); 
} 

Вот результат:

HTTP/1.1 200 OK 
Content-Type: text/xml 
Content-Length: 2 
Connection: keep-alive 
Server: Jetty(8.1.9.v20130131) 

hi 

Любая идея, как я могу вынести свой собственный выход непосредственно в выходной поток-и установить тип содержимого надлежащим образом? Заранее спасибо.

ответ

2

Я не вижу ничего плохого в том, что вы делаете. По крайней мере, настройка типа контента в HttpServletResponse должна работать. В любом случае, вы можете иметь больше контроля над тем, что вы возвращаете, если используете javax.ws.rs.core.Response. См., Если это работает:

@Path("/foo") 
@WebService 
public class FooService { 
    @Path("/bar") 
    @GET 
    @WebMethod 
    public Response bar() { 
     return Response.ok().type("text/plain").entity("hi").build(); 
    } 
    ... 
+0

Да, это правильный способ сделать это. Большое спасибо. – Gray

Смежные вопросы