Java 如何在spring中解析http接受头?

Java 如何在spring中解析http接受头?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我想在Spring中解析一个HTTPAccept头,以确定是否可以发回JSON。我正在尝试以下代码 class MediaTypeUtil { private final static Logger logger = LoggerFactory.getLogger(MediaTypeUtil.class); static boolean acceptsJson(HttpServletRequest request) { try { String accept = re

我想在Spring中解析一个HTTPAccept头,以确定是否可以发回JSON。我正在尝试以下代码

class MediaTypeUtil {
  private final static Logger logger = LoggerFactory.getLogger(MediaTypeUtil.class);
  static boolean acceptsJson(HttpServletRequest request) {
    try {
      String accept = request.getHeader("Accept");
      MediaType requestType = MediaType.valueOf(accept);
      return MediaType.APPLICATION_JSON.isCompatibleWith(requestType);
    } catch (InvalidMediaTypeException e) {
      logger.debug("MediaType parsing error",e);
      return false;
    }
  }
}
当一个请求到达时,其接受头值为application/json、application/javascript、text/javascript、text/json,我将以一个异常结束

Caused by: org.springframework.util.InvalidMimeTypeException: Invalid mime type "application/json, application/javascript, text/javascript, text/json": Invalid token character ',' in token "json, application/javascript, text/javascript, text/json"
    at org.springframework.util.MimeTypeUtils.parseMimeTypeInternal(MimeTypeUtils.java:262)
这段代码是从Servlet过滤器中使用的,所以我不能依赖SpringMVC注释


Spring是否有解析accept头并确定其是否与特定媒体类型兼容的方法

Spring本身在内部执行的操作与您完全相同,即从请求中获取ACCEPT标头,但它们将其提供给此调用:

MediaType.parseMediaTypes(get(ACCEPT));

这将返回一个您需要处理的列表。

Spring本身在内部执行的操作与您完全相同,即从请求中获取ACCEPT标头,但它们会将其提供给此调用:

MediaType.parseMediaTypes(get(ACCEPT));

它将返回一个需要处理的列表。

为什么不简单地将注释@RequestMapping与consumes或Products一起使用?顺便说一句:您会得到一个逗号分隔的列表作为accept标头。您可以在处拆分它,并解析它的每一部分。该代码位于servlet过滤器中,因此可以访问@RequestMapping,是的,我可以拆分字符串,但是我认为这个功能已经在spring中的某个地方了,我更愿意重用它,因为它可能正确地处理了角落的情况。为什么不简单地将注释@RequestMapping与consumes或Products一起使用呢?顺便说一句:您会得到一个逗号分隔的列表作为accept标头。您可以在处拆分它,并解析它的每一部分。此代码位于servlet过滤器中,因此可以访问@RequestMapping,是的,我可以拆分字符串,但我认为此功能已经在spring中的某个地方,我更愿意重用它,因为它可能正确地处理了各种情况。