【发布时间】:2017-07-19 18:52:15
【问题描述】:
我有一个返回文件文本的网络服务。如果出现问题,我想发回一个描述错误的 json 对象。我已经读到@Produces 注释中可能有多个 MediaType,但我无法让它工作(它只与第一个 MediaType 一起使用)。我可能需要一种方式来说“在此处生成文本,在此处生成 json”。
@GET
//@Produces( {MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) doesn't work either.
@Produces( MediaType.TEXT_PLAIN )
@Path( "/{filename}" )
public Response get( @PathParam( "filename" ) String filename ) {
String text;
try {
text = service.getFileText( service.getDirectory(), filename );
}
catch ( MyFileNotFoundException ex ) {
//Make a JSON object describing the error.
return ErrorResponder.sendErrorObject(ex.getMessage(), Response.Status.BAD_REQUEST);
}
//Send back plain text.
return Response.ok().entity( text ).build();
}
谢谢。
ErrorResponder.sendErrorObject 目前是这样返回的;将尝试 .type() 函数:
return Response.status( status ).entity( errorObject ).build();
【问题讨论】:
-
什么是
ErrorResponder? -
它只是一个帮助类,它为错误创建一个 json 对象。例如:{“错误”:[“A”,“B”,“C”]}。我能做的就是把它作为一个字符串发回,让客户端处理它,但它看起来很奇怪。
-
sendErrorObject()方法是否将媒体类型设置为 JSON,例如像这样?Response.status(Response.Status.BAD_REQUEST).type(MediaType.APPLICATION_JSON).entity(jsonText).build()--- 但总的来说,没有看到ErrorResponder做了什么,您希望我们如何告诉您为什么它不起作用? -
不,它不会那样做。我会试试的。我没有把它放在那里,因为我认为它已经足够抽象了(“它发送 JSON”)并且容器处理了它,但显然我错了。
-
如果
@Produces列出了多个类型,它会使用内容协商规则选择一个类型,如果你给entity()调用一个对象,它会尝试根据协商类型。由于您希望text/plain用于正常响应,因此您应该只在@Produces中列出它,如果您决定发送其他媒体类型,则覆盖它。
标签: java json web-services rest