【发布时间】:2020-01-31 06:14:18
【问题描述】:
我在互联网上搜索了几个小时,并尝试了我找到的解决方案,以便在控制器方法上使用自定义参数注释。
这背后的想法是,我想练习在使用 spring 时如何使用自定义注释映射请求、响应和各种事物。
所以我想要创建一个注释参数,它应该创建一个Map 实例,我的界面是这样编码的:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SearchCriteria {
String value() default "";
}
解析器:
public class SearchCriteriaResolver implements HandlerMethodArgumentResolver {
private Logger log = LoggerFactory.getLogger(SearchCriteriaResolver.class);
private Map<String, Object> parameters = new HashMap<>() {{
put("name", "");
put("limit", 10);
}};
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(SearchCriteria.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();
log.info("Parameter test: " + request.getParameter("test"));
return this.parameters;
}
}
还有配置者:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new SearchCriteriaResolver());
}
}
我在互联网上多次发现处理程序是以这种方式创建的。所以在控制器中,我正在使用这样的注释:
@RestController
@RequestMapping("/series")
public class SeriesController {
private static final Logger log = LoggerFactory.getLogger(SeriesController.class);
@Autowired
SeriesService seriesService;
@GetMapping
public ResponseEntity<List<SeriesBatch>> getSeriesList(@SearchCriteria Map<String, Object> parameters) {
log.info("GET /series/ -> getSeriesList");
log.info(parameters.toString());
List<SeriesBatch> seriesList = this.seriesService.findAll();
return new ResponseEntity<>(seriesList, HttpStatus.OK);
}
...
}
所以每次触发这个端点时我一直在检查日志,但是解析器上的日志没有被触发,并且控制器方法中的日志只显示一个空对象。我已经调试了应用程序开始查看是否正在调用resolvers.add,它是,但由于某种原因我不知道,这个注释的逻辑没有被执行。
注意:我正在学习 spring 并在很长一段时间后收回 JAVA,所以如果能解释为什么它必须是这样的答案,我将不胜感激。
【问题讨论】: