论坛首页 Java企业应用论坛

Spring开闭原则的表现-BeanPostProcessor扩展点-2

浏览 26169 次
该帖已经被评为精华帖
作者 正文
   发表时间: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 可以比较优雅通过注解来解决。

0 请登录后投票
   发表时间: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,所以也就没再研究这个问题。

最近刚好有点其他想法,正好看到你的一系列帖子,感觉很好!

我用你说的第三种方式尝试一下!

多谢!
0 请登录后投票
   发表时间: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执行流程觉得这样可行
0 请登录后投票
   发表时间: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,技术在于分享!

你发的这一系列文章都很好,继续...我们都时刻关注着呢!(虽然有时候光看不回帖
0 请登录后投票
   发表时间: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,技术在于分享!

你发的这一系列文章都很好,继续...我们都时刻关注着呢!(虽然有时候光看不回帖

希望有共鸣的 有想法的 咱一起探讨学习下,这样咱才会进步 呵呵。 早睡早起,注意身体!
0 请登录后投票
   发表时间:2012-04-24  
学习了,期待楼主更多的大作
0 请登录后投票
   发表时间:2012-05-16  
一直关注楼主的头像,敢问楼主是涛弟弟吗?
0 请登录后投票
   发表时间:2012-05-16  
lvjun106 写道
一直关注楼主的头像,敢问楼主是涛弟弟吗?

是啊,你是?
0 请登录后投票
   发表时间:2012-05-17  
jinnianshilongnian 写道
lvjun106 写道
一直关注楼主的头像,敢问楼主是涛弟弟吗?

是啊,你是?


看ID就知道我是谁了吧!
你火了啊!
0 请登录后投票
   发表时间:2012-05-22  
以前有研究过,扩展点,现在没忘记了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics