在我们的项目中,我们已经有一些必要的控制器,我的任务是使其更容易。它应该这样工作:我只是将注释放在控制器下,而处理程序可以完成所有工作。我已经拥有的东西:
/**
* This annotation marks collector methods
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Collect {
}
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Collectors {
/**
* An array of subclasses that can load and provide values for
* generating a ModelMap.
*/
Class<?>[] value();
}
我找不到任何示例如何做。控制器示例:
@Controller
public class TestController {
private final SchoolService schoolService;
private final TeacherService teacherService;
public TestController(SchoolService schoolService, TeacherService teacherService) {
this.schoolService = schoolService;
this.teacherService = teacherService;
}
/**
* Saves the static list of users in model and renders it
* via freemarker template.
*
* @param model
* @return The index view (FTL)
*/
@Collectors(SchoolCollector.class)
@RequestMapping(value = "freemarker/freemarkertest", method = RequestMethod.GET)
public String index(@ModelAttribute("model") ModelMap model) {
List<SchoolDTO> schoolList = new ArrayList<SchoolDTO>();
schoolList = schoolService.findAll();
model.addAttribute("schoolList", schoolList);
return "freemarkertest";
}
/**
* Add a new School
*
* @param schoolDTO
* @return Redirect back to same /freemarkertest page to display school list, if successful
*/
@Collectors(SchoolCollector.class)
@RequestMapping(value = "freemarker/freemarkertest/add", method = RequestMethod.POST)
public String add(@ModelAttribute("schoolDTO") SchoolDTO schoolDTO) {
if(schoolDTO.getName() != null && !schoolDTO.getName().isEmpty() &&
schoolDTO.getEnabled() != null) {
schoolService.save(schoolDTO);
return "redirect:";
} else {
return "redirect:error"; //TODO: create error page
}
}
/**
* Get list of teachers.
*
* @param model
* @param schoolId
* @return The index view (FTL)
*/
@Collectors(SchoolCollector.class)
@RequestMapping(value = "freemarker/teachers/{schoolId}", method = RequestMethod.GET)
public String index(@ModelAttribute("model") ModelMap model, @PathVariable Long schoolId) {
List<TeacherDTO> teachers = teacherService.getAllBySchoolId(schoolId);
model.addAttribute("teachersList", teachers);
model.addAttribute("schoolId", schoolId);
return "teachers";
}
}
您需要的是HandlerInterceptoradapter。这些必须在您的SpringMvc-servlet.xml
中定义,而这些都将拦截您的所有请求。
public class CollectorHandler extends HandlerInterceptorAdapter {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (handler instanceof HandlerMethod && modelAndView != null) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
if (handlerMethod.getMethodAnnotation(Collectors.class) == null) {
return;
}
/**
* Your logic here
*/
}
}
}
用于进一步阅读:
- http://www.baeldung.com/spring-mvc handlerinterceptor
- https://www.mkyong.com/spring-mvc/spring-mvc handler-interperler-interpectors-example/
ps:我还想补充说,您的代码无法正常工作,因为其中有一些"错误" ...返回字符串而不是对象作为示例