java - HandlerMethodReturnValueHandler 不起作用
问题描述
在我的 Spring Boot 项目中,我创建了一个扩展类 HandlerMethodReturnValueHandler
使用以下代码(为简洁起见)
public class ModelResolver implements HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return true;
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
//Some code
}
}
然后在我的 Config 类中做了:
@Configuration
@EnableAutoConfiguration
public class Config implements WebMvcConfigurer {
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(new ModelResolver());
}
}
然后在我的集成测试方法中,简单地创建了一个mockMvc,如下所示
MvcResult mvcResult = mockMvc.perform(post(BASE_URL + "create"))
.andExpect(status().isBadRequest())
.andReturn();
但handleReturnValue
不叫。
我把断点放在addReturnValueHandlers
配置里面supportsReturnType
和里面handleReturnValue
。
里面的那个addReturnValueHandlers
被抓到了,但是没有supportsReturnType
也handleReturnValue
没有被抓到!
你们有什么想法吗?
解决方案
@Autowired
private lateinit var requestMappingHandlerAdapter: RequestMappingHandlerAdapter
@PostConstruct
fun init() {
requestMappingHandlerAdapter.returnValueHandlers?.let { returnValueHandlers ->
val newReturnValueHandlers = ArrayList<HandlerMethodReturnValueHandler>(returnValueHandlers.size + 1)
newReturnValueHandlers.add(0, ApiReturnHandler(requestMappingHandlerAdapter.messageConverters))
newReturnValueHandlers.addAll(returnValueHandlers)
requestMappingHandlerAdapter.returnValueHandlers = newReturnValueHandlers
}
}
推荐阅读
- authorization - 在 Blazor 服务器端 CRUD 应用程序中授权登录用户查看他们的特定数据(不是所有用户创建的所有数据)
- java - springboot启动项目的pom.xml文件报错如何解决?
- sql - Postgres 中的递归 CTE
- php - PayPal IPN:读取多个 item_name 和数量并保存到数据库
- azure - Azure OAuth2 客户端凭据流 - 获取多个范围的令牌会引发错误
- node.js - WebSocket 连接到“wss://api.example.com/ws”失败:WebSocket 握手期间出错:意外响应代码:404
- gitkraken - GitKraken:无法打开公钥文件
- javascript - 如何在 javascript 中重定向自定义生成的 URL?
- android - Android 工作室 - MVP 模式
- ios - Siri,通过 Swift 改变语言识别,动态