我有一个带有控制器的 Spring MVC Web 应用程序,如下所示:
@Controller
public class ActionRestController {
@RequestMapping(value = "/list", method = GET)
@ResponseBody
public List<Action> list(Action action, SearhCriteria searchCriteria) {
List<Action> ret = new ArrayList<Action>();
// Call a service method to get the records
// Copy the records into the list
// return the list of objects
return ret;
}
当用户进行搜索时调用控制器。应用程序中有几个这样的控制器,每个可搜索实体一个。由于我无法很好解释的原因,在这里,我无论如何都无法修改这些控制器。
但是现在,我在 UI 中要求显示搜索条件和编号。记录和寻呼细节,以及。控制器不返回此信息。控制器返回的 JSON 仅包含记录列表。
我已经建立了一个不同的控制器来处理请求,获取并将额外的信息放入模型中,并将请求转发到现有的控制器,如下所示:
@Controller
public class ActionExtendedController {
@RequestMapping(value = "/searchlist", method = GET)
@ResponseBody
public List<Action> list(Action action, SearhCriteria searchCriteria, Model model) {
model.addAttribute("searchParameters", searchCriteria);
return "forward:/list";
}
到目前为止,一切都很好。我想要做的是在从控制器返回列表的点处拦截请求,然后将其转换为 JSON,并返回包含列表和搜索参数的映射。
现在,由于“不可变”控制器用户 ResponseBody 控制转到 JacksonMessageConverter 并且响应从那里发出。我已经尝试了以下路径,但它们不起作用。
拦截器——当我到达这里的时候,响应已经写出来了,所以没有办法改变它。
JasksonMessageConverter 的自定义 ObjectMapper - 不起作用,因为我无权访问映射器内的模型对象,我只能访问控制器返回的列表。
Aspect @After 控制器切入点 - 我认为这种技术会起作用,但我无法让它发挥作用。该建议没有触发,我确信我在配置中遗漏了一些东西。
有没有办法让 Spring AOP 在带注释的控制器、处理程序方法上触发,或者任何人都可以建议另一种拦截处理程序返回值的方法(连同模型)?