该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-21
key232323 写道 guofengcn 写道 guofengcn 写道 问一个问题:
我想扩展MappingJacksonHttpMessageConverter(或者自己实现HttpMessageConverter用别的Json处理lib来实现)在方法上使用注解@ResponseBody 来返回json。 但是遇到一个问题,我们返回的对象,比如User,是有很多属性的,并不需要序列化所有的属性,而且是每个方法上不一样的(所以不能直接在实体上写Jackson的ignore注解来实现),想在controller层的方法上加个自定义注解来实现,但是HttpMessageConverter这个接口,并没有传入任何当前的handlerMethod,所以也就无法获取当前方法上的我自己定义的注解。 不知道有没有什么好的方案来实现这样的功能? customModelAndViewResolvers倒是可以实现这个功能,但是感觉不太方便 每个方法上不一样——是不是可以自己wrap一个JsonTransformerWrap,传递一个Object target,然后根据每个方法,再set一个List标示想output哪些properties, 然后用这个JsonTransformerWrap去做json output PS:如果是动态语言,就更容易实现些,可以在运行时候动态修改/删除User的properties 1、这位仁兄所的就可以解决,自定义Transformer 如Model -----Map (指定要排除的对象图)。这种方式需要每个功能处理方法写一次转换。这种方式最简单 2、从你说ModelAndViewResolver知道使用3.0,实现起来是比较麻烦,如你需要按照如下流程自己实现: if (AnnotationUtils.findAnnotation(handlerMethod, ResponseBody.class) != null) { handleResponseBody(returnValue, webRequest); //此处需要你自定义 return null; } 而且可能此处只能不能自动获取注册的MessageConverter,比较麻烦,,,所以还不如采用第一种方式。 3、如果你使用Spring3.1,可以注册HandlerMethodReturnValueHandler到RequestMappingHandlerAdapter,如RequestResponseBodyMethodProcessor用于支持@RequestBody注解的,你可以覆盖这个: //通过returnType就可以得到handleMethod public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException { mavContainer.setRequestHandled(true); //设置成true后表示流程结束 直接返回 if (returnValue != null) { writeWithMessageConverters(returnValue, returnType, webRequest);//写msg出去 } } 如果你使用Spring3.1 可以比较优雅通过注解来解决。 |
|
返回顶楼 | |
发表时间:2012-04-21
jinnianshilongnian 写道 3、如果你使用Spring3.1,可以注册HandlerMethodReturnValueHandler到RequestMappingHandlerAdapter,如RequestResponseBodyMethodProcessor用于支持@RequestBody注解的,你可以覆盖这个: //通过returnType就可以得到handleMethod public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException { mavContainer.setRequestHandled(true); //设置成true后表示流程结束 直接返回 if (returnValue != null) { writeWithMessageConverters(returnValue, returnType, webRequest);//写msg出去 } } 如果你使用Spring3.1 可以比较优雅通过注解来解决。 我现在用的是3.1,这个问题是3.0刚刚发布的时候发现的,后来也没用spring MVC 3,所以也就没再研究这个问题。 最近刚好有点其他想法,正好看到你的一系列帖子,感觉很好! 我用你说的第三种方式尝试一下! 多谢! |
|
返回顶楼 | |
发表时间:2012-04-21
guofengcn 写道 jinnianshilongnian 写道 3、如果你使用Spring3.1,可以注册HandlerMethodReturnValueHandler到RequestMappingHandlerAdapter,如RequestResponseBodyMethodProcessor用于支持@RequestBody注解的,你可以覆盖这个: //通过returnType就可以得到handleMethod public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException { mavContainer.setRequestHandled(true); //设置成true后表示流程结束 直接返回 if (returnValue != null) { writeWithMessageConverters(returnValue, returnType, webRequest);//写msg出去 } } 如果你使用Spring3.1 可以比较优雅通过注解来解决。 我现在用的是3.1,这个问题是3.0刚刚发布的时候发现的,后来也没用spring MVC 3,所以也就没再研究这个问题。 最近刚好有点其他想法,正好看到你的一系列帖子,感觉很好! 我用你说的第三种方式尝试一下! 多谢! 成功了告诉兄弟下,或者写篇文章分享下 哈哈,我只是刚才看了下SpringMVC执行流程觉得这样可行 ! |
|
返回顶楼 | |
发表时间:2012-04-21
jinnianshilongnian 写道 guofengcn 写道 jinnianshilongnian 写道 3、如果你使用Spring3.1,可以注册HandlerMethodReturnValueHandler到RequestMappingHandlerAdapter,如RequestResponseBodyMethodProcessor用于支持@RequestBody注解的,你可以覆盖这个: //通过returnType就可以得到handleMethod public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException { mavContainer.setRequestHandled(true); //设置成true后表示流程结束 直接返回 if (returnValue != null) { writeWithMessageConverters(returnValue, returnType, webRequest);//写msg出去 } } 如果你使用Spring3.1 可以比较优雅通过注解来解决。 我现在用的是3.1,这个问题是3.0刚刚发布的时候发现的,后来也没用spring MVC 3,所以也就没再研究这个问题。 最近刚好有点其他想法,正好看到你的一系列帖子,感觉很好! 我用你说的第三种方式尝试一下! 多谢! 成功了告诉兄弟下,或者写篇文章分享下 哈哈,我只是刚才看了下SpringMVC执行流程觉得这样可行 ! OK,技术在于分享! 你发的这一系列文章都很好,继续...我们都时刻关注着呢!(虽然有时候光看不回帖 ) |
|
返回顶楼 | |
发表时间:2012-04-21
guofengcn 写道 jinnianshilongnian 写道 guofengcn 写道 jinnianshilongnian 写道 3、如果你使用Spring3.1,可以注册HandlerMethodReturnValueHandler到RequestMappingHandlerAdapter,如RequestResponseBodyMethodProcessor用于支持@RequestBody注解的,你可以覆盖这个: //通过returnType就可以得到handleMethod public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException { mavContainer.setRequestHandled(true); //设置成true后表示流程结束 直接返回 if (returnValue != null) { writeWithMessageConverters(returnValue, returnType, webRequest);//写msg出去 } } 如果你使用Spring3.1 可以比较优雅通过注解来解决。 我现在用的是3.1,这个问题是3.0刚刚发布的时候发现的,后来也没用spring MVC 3,所以也就没再研究这个问题。 最近刚好有点其他想法,正好看到你的一系列帖子,感觉很好! 我用你说的第三种方式尝试一下! 多谢! 成功了告诉兄弟下,或者写篇文章分享下 哈哈,我只是刚才看了下SpringMVC执行流程觉得这样可行 ! OK,技术在于分享! 你发的这一系列文章都很好,继续...我们都时刻关注着呢!(虽然有时候光看不回帖 ) 希望有共鸣的 有想法的 咱一起探讨学习下,这样咱才会进步 呵呵。 早睡早起,注意身体! |
|
返回顶楼 | |
发表时间:2012-04-24
学习了,期待楼主更多的大作
|
|
返回顶楼 | |
发表时间:2012-05-16
一直关注楼主的头像,敢问楼主是涛弟弟吗?
|
|
返回顶楼 | |
发表时间:2012-05-16
lvjun106 写道 一直关注楼主的头像,敢问楼主是涛弟弟吗?
是啊,你是? |
|
返回顶楼 | |
发表时间:2012-05-17
jinnianshilongnian 写道 lvjun106 写道 一直关注楼主的头像,敢问楼主是涛弟弟吗?
是啊,你是? 看ID就知道我是谁了吧! 你火了啊! |
|
返回顶楼 | |
发表时间:2012-05-22
以前有研究过,扩展点,现在没忘记了
|
|
返回顶楼 | |