首页 > 解决方案 > 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被抓到了,但是没有supportsReturnTypehandleReturnValue没有被抓到!

你们有什么想法吗?

标签: javaspring-bootspring-mvc

解决方案


@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
        }

    }

推荐阅读