我想在方法运行时选择响应媒体类型。
例如以下代码:
@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种。
- byte[](通过正常执行路径)
- 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/