Spring:如何在运行时选择响应类型?

标签 spring spring-mvc spring-boot

我想在方法运行时选择响应媒体类型。

例如以下代码:

@RequestMapping(value = "/getRecord",
    produces = {"application/octet-stream", "application/json;charset=UTF-8" })
public byte[] getData(
    @RequestParam(value="id", required=true) Integer id)
    throws IOException
{
    if (id == 1)
        return createByteArray();
    throw new MyDataException();
}

在这段代码中,可能的响应类型实际上是2种。

  1. byte[](通过正常执行路径)
  2. MyDataException(通过异常执行路径)

MyDataException 随后由异常处理程序处理,并转换为简单的类。它可以转换为 json 响应。

首先,我认为如果我为@RequestMapping注解的 Produces 选项提供2种响应类型,消息转换器会根据实际返回来转换这2种类型目的。但事实并非如此。

在spring类org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor中,writeWithMessageConverters()方法在选择时只是忽略实际的返回对象类型如果存在 Produces 选项,则为响应类型。

如何让Spring根据实际返回对象选择运行时的响应类型?

最佳答案

我建议您使用@ControllerAdvice用于处理 Spring MVC 处理程序中的异常的注释。这是分离错误处理问题的非常优雅的方法(实际上有 3 种方法可以消除异常处理问题),例如设置适当的 HTTP 响应代码(2xx 之外的代码)和发送回错误消息/object。

有一个很棒的博客here .

示例(借自 Spring 博客):-

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.CONFLICT)  // 409
    @ExceptionHandler(DataIntegrityViolationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}

在你的情况下,我建议采用 @ControllerAdvice 方法,例如:-

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.CONFLICT)  // 409
    @ResponseBody
    @ExceptionHandler(MyDataException.class)
    public AnyReturnType handleConflict(Exception exception) {
         return exception.getDetails();
    }
}

处理程序的返回类型也可以是 ModelAndView 对象,它将错误对象传递到 View 层。

请参阅博客了解更多详细信息。

关于Spring:如何在运行时选择响应类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30228512/

相关文章:

spring - Spring MVC中的多 View 解析器

java - Gradle 依赖排除后依赖仍然在类路径上

spring - Spring Boot Security login.html在Grails 3.0中的位置

spring - common.KafkaException : com. fastxml.jackson.databind.ser.std.StringSerializer 不是 org.apache.kafka.common.serialization.Serializer 的实例

java - 如何编辑 Spring Pageable 对象?

java - 使用 Spring 电子邮件抽象层阅读邮件

java - Elasticsearch 升级(2.4 至 5.0.1)。无法解析类 - 间接引用错误

java - 在独立应用程序中使用@Transactional

spring-mvc - 使用注释的 Spring MVC CRUD 应用程序

java - 使用 spring boot 和 mongodb 检索具有完整和不完整配置文件的用户数量的最佳方法是什么?