@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.METHOD})
public @interface Test {}
@Configuration
public class TestConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new TestArgumentResolver());
}
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(new TestArgumentResolver());
}
}
public class TestArgumentResolver implements HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(Test.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Result r = getVal(webRequest.getNativeRequest(HttpServletRequest.class), parameter);
if (r.isSuccess()) return r.getData();
HttpServletResponse resp = webRequest.getNativeResponse(HttpServletResponse.class);
resp.getWriter().write(r.getMessage());
resp.getWriter().flush();
return null;
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return returnType.hasMethodAnnotation(Test.class);
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
HttpServletResponse resp = webRequest.getNativeResponse(HttpServletResponse.class);
resp.getWriter().write(getResult(returnValue));
resp.getWriter().flush();
}
}
@Test
public int test(@Test int id) {
return id;
}