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
}
下一篇: Type when accessing Domino Access Service via Alamofire in Swift
