API Different Content
Since some weeks I'm working on an rest api using spring-mvc. The REST-API is working properly and I`m almost done until one last problem when it comes to error handling with specific error-objects.
The REST-API is using JSON as format to serialize Java-Objects. When an error occurs during service-execution an specific error-object gets created and sent back to the client.
Everything is working fine when my rest-services are marked as "produces=application/json". But there are also some services which only need to return simple text using "produces=text/plain". When an error occurs in one of these services Spring-MVC will throw an HttpMediaTypeNotAcceptableException. Seems to be correct cause client asks for content-type "text/plain" but server response with "application/json".
Can you tell me what's the correct solution for this problem?
Only using JSON as response content-type and wrapping simple text always in an special class object. => Seems to me not really REST like, cause REST should support multiple content-types.
Every service serving "text" will be marked as "produces=application/json;text/plain" and Client also need to send both in "accept-header". => When doing it this way the API seems to support two content-types for same resource. But that`s not right. Only in case of an error the API will return JSON, otherwise it will be always "text".
Sounds for me like a really special REST question and couldn`t find related questions on this topic.
 User should always specify what content it's expecting with Accept header.  It's you job to return the error that was thrown/caught on the server side in the format that was specified in Accept header.  In spring as far as I know it could be achieved with a special mapper.  Below you can find such mapper written in groovy to handle 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
  }
}
 And ExceptionResponse class:  
class ExceptionResponse {
  String error
  String exception
  String message
  String path
  Integer status
  Long timestamp
}
                        链接地址: http://www.djcxy.com/p/48186.html
                        上一篇: 如何通过spring RestTemplate在获取请求中更改响应http头?
下一篇: API不同的内容
