簡體   English   中英

在jax-rs REST服務中更改內容類型

[英]Changing content type in jax-rs REST service

請原諒我,但我可能不熟悉正確提出這個問題所需的所有術語。

我正在使用jax-rs的org.apache.cxf.jaxrs.ext實現在Java中開發一個相當簡單的REST Web服務。 方法標題如下:

@GET
@Path("json/{fullAlias}")
@Produces({"application/json"})
public String json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req)

其中MessageContext是org.apache.cxf.jaxrs.ext.MessageContext

有兩件事我想要完成,我似乎無法弄清楚:

  1. 如果滿足某些條件,則更改內容類型(例如,出錯)
  2. 更改響應的狀態代碼

我試過通過MessageContext訪問它來改變響應:

HttpServletResponse response = req.getHttpServletResponse();
response.setContentType("text/plain")
response.setStatus("HttpServletResponse.SC_BAD_REQUEST);

但這些變化與發送的響應無關; 無論有沒有@Produces注釋,在方法內設置內容類型都不會影響實際內容類型(使用注釋時,它當然會返回“application / json”,而不會默認為“text / html”)。

我正在返回一個簡單的String作為正文。 我試圖返回一個javax.ws.rs.core.Response對象來做我想做的事,但我不太了解它。

如何從此方法中更改內容類型和/或狀態代碼?

一種方法是拋出WebApplicationException,如Pace所描述的,如果您希望專門處理錯誤條件,它將起作用。 如果您希望能夠出於任何原因隨時更改您的內容,那么您將需要查看作為服務方法而不是String的結果返回Response。 返回響應可以讓您對服務如何響應客戶端請求進行最大程度的控制(它需要的代碼多於返回簡單字符串所需的代碼)。

以下是如何使用Response對象的示例:

@GET
@Path("json/{fullAlias}")
public Response json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) {
    ...
    if (success) {
        ResponseBuilder rBuild = Response.ok(responseData, MediaType.APPLICATION_JSON);
        return rBuild.build();
    }
    else {
        ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
        return rBuild.type(MediaType.TEXT_PLAIN)
                     .entity("error message")
                     .build();
    }    
}

我不確定這是否是最好的方法,但我已經做了以下工作來解決你的問題#1。

public WebApplicationException createStatusException(String statusMessage) {
    ResponseBuilder rb = Response.noContent();
    rb = rb.type(MediaType.TEXT_PLAIN);
    rb = rb.status(Status.BAD_REQUEST);
    rb = rb.entity(statusMessage);
    return new WebApplicationException(rb.build());
}

編輯:然后我拋出了生成的WebApplicationException

您可以編寫自己的響應過濾器來更改內容類型標頭。

@Provider
public class MimeAddingFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {
        responseContext.getHeaders().add("Content-Type", "image/png");
    }

}

此過濾器將添加“image / png”內容類型標頭。 您還可以在JAX-RS響應過濾器中更改或刪除標頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM