以前的设计
我有一个春天控制器建立像如下:
@RequestMapping(value = "/rest/funf/{datatype}", method = RequestMethod.GET)
public ModelAndView getFunfData(@PathVariable("datatype") String dataType,
WebRequest request) throws HttpException {
我也有一个HandlerInterceptorAdapter
是进行前处理和后处理(根据政策修改返回的模型)。 对于后处理处理程序中的签名是以下
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
它实际上运作良好。 的REST API返回一个未结构良好的JSON有效载荷,但至少拦截器(策略执行点)能够从模型匿名化(条用户个人数据)和取代它。
问题的关键是与旧的设计,我能够检索响应之前,它被发送到输出,修改和重新注入它到ModelAndView
实例。 无需上传代码简洁。
新的设计
现在,我发现了一个新的设计,帮助我克服了响应结构的缺陷。
当我return new ModelAndView(jacksonView_instance, "data", dataToConvertToJson)
它的结构像
{
"data": {
"myAttr1":"myVal1"
}
}
当接收程序要有效载荷转换成JSON这是坏的。 所以,我发现
@RequestMapping(value = "/rest/funf/{datatype}", method = RequestMethod.GET, produces = { "application/json" })
public @ResponseBody
Object[] getFunfData(@PathVariable("datatype") String dataType,
WebRequest request) throws HttpException {
这简化了代码一点,最重要的作出反应良好的结构 ,像
{
"myAttr1":"myVal1"
}
这是REST设计合同完全确定,但
问题
现在的HandlerInterceptor将无法再找回我从API返回的模式,因此对象(这是一个FUNF -相关API来处理个人数据,即使是敏感,记录在移动设备上)。
所以,如果我需要匿名化的记录,我不能做到这一点在像以前一样拦截
解决方法
我意识到,我可以杀了拦截和API在执行政策执行权,但这不是一个伟大的设计,甚至因为它进行授权的PEP preHandle
和义务的执法中postHandle
目前是自动的实例化一个Spring对象。 API中的拷贝和粘贴代码与多个API打交道时,一个坏主意,并在中短期改变/延长PEP执行的可能性。
无论如何,让我们制定一个直的问题后,已经解释了上下文以及
问题是
由于返回一个对象的通用Spring MVC的API来通过内容谈判来处理
@RequestMapping(value = "/path/{variable}", method = RequestMethod.GET)
public @ResponseBody Object api() {
如何可以拦截返回的对象在外部类进行修改,以使其? (例如,用一个新的对象实例来替换返回给客户端)