API不同的内容
自从几个星期以来,我正在使用spring-mvc工作其余的api。 REST-API工作正常,并且我们几乎完成了直到最后一个问题,当涉及到使用特定错误对象进行错误处理时。
REST-API使用JSON作为格式来序列化Java对象。 在服务执行过程中发生错误时,会创建一个特定的错误对象并将其发送回客户端。
当我的休息服务被标记为“produce = application / json”时,一切正常。 但也有一些服务只需要使用“produce = text / plain”返回简单的文本。 当其中一个服务发生错误时,Spring-MVC将抛出一个HttpMediaTypeNotAcceptableException异常。 似乎是正确的原因客户端请求内容类型“文本/纯文本”,但服务器响应“application / json”。
你能告诉我什么是这个问题的正确解决方案吗?
只使用JSON作为响应内容类型并将简单文本包装在特殊的类对象中。 =>对我来说似乎并不像REST那样,导致REST应该支持多种内容类型。
每个服务“文本”的服务都将被标记为“produce = application / json; text / plain”,客户端也需要在“accept-header”中发送。 =>当这样做时,API似乎支持相同资源的两种内容类型。 但那不对。 只有在发生错误的情况下,API才会返回JSON,否则它将始终为“文本”。
听起来像是一个非常特殊的REST问题,无法找到关于此主题的相关问题。
用户应该始终使用Accept
标头指定期望的内容。 您的工作是以Accept
头中指定的格式返回在服务器端抛出/捕获的错误。 据我所知,春天可以用特殊的mapper来实现。 下面你可以找到用groovy编写的这样的mapper来处理text/html
。
import groovy.xml.MarkupBuilder
import org.springframework.http.HttpInputMessage
import org.springframework.http.HttpOutputMessage
import org.springframework.http.converter.AbstractHttpMessageConverter
import static org.springframework.http.MediaType.TEXT_HTML
class ExceptionResponseHTMLConverter extends AbstractHttpMessageConverter<ExceptionResponse> {
ExceptionResponseHTMLConverter() {
super(TEXT_HTML)
}
@Override
boolean supports(Class clazz) {
clazz.equals(ExceptionResponse)
}
@Override
ExceptionResponse readInternal(Class clazz, HttpInputMessage msg) {
throw new UnsupportedOperationException()
}
@Override
void writeInternal(ExceptionResponse e, HttpOutputMessage msg) {
def sw = new StringWriter()
new MarkupBuilder(sw).error {
error(e.error)
exception(e.exception)
message(e.message)
path(e.path)
status(e.status)
timestamp(e.timestamp)
}
msg.body << sw.toString().bytes
}
}
和ExceptionResponse
类:
class ExceptionResponse {
String error
String exception
String message
String path
Integer status
Long timestamp
}
链接地址: http://www.djcxy.com/p/48185.html
下一篇: Type when accessing Domino Access Service via Alamofire in Swift