0

我有一个带有控制器的 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 在带注释的控制器、处理程序方法上触发,或者任何人都可以建议另一种拦截处理程序返回值的方法(连同模型)?

4

2 回答 2

0

为什么不将返回类型更改为 Map?像:

@Controller
public class ActionRestController {
@RequestMapping(value = "/list", method = GET)
@ResponseBody
public Map<String, Object> list(Action action, SearhCriteria searchCriteria) {  
    Map<String, Object> map = new HashMap<String, Object>();     
    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
    map.put("searchResult",ret);
    map.put("searchCriteria", searchCriteria);
    return map;
}
于 2012-09-09T09:51:38.550 回答
0

在扩展控制器中对基本控制器进行简单委托怎么样:

@Controller
public class ActionExtendedController {
    @Autowired ActionRestController baseRestController;
    @Autowired MappingJacksonJsonView mappingJacksonJsonView;

    @RequestMapping(value = "/searchlist", method = GET)
    public View list(Action action, SearhCriteria searchCriteria, Model model) {
        List<Action> actions = baseRestController.list(action, searchCriteria, model);
        model.addAttribute("actions", actions);
        model.addAttribute("searchParameters", searchCriteria);
        return mappingJacksonJsonView;
    }

这样,您将委派给原始控制器,但将这个新控制器用于视图。只需将 a 注册mappingJacksonJsonView为 bean,它会将所有模型对象(搜索条件和操作)序列化到 json 视图中。您甚至不需要返回视图,但也可以使用 @ResponseBody,其类型可以保存响应和搜索条件。

于 2012-09-09T14:18:14.893 回答