Spring mvc——接收对象Json数据,<mvc:annotation-driven/><context:annotation-config/><context:component-scan/>

来源:互联网 发布:windows可上网镜像 编辑:程序博客网 时间:2024/06/06 00:21

1、基础知识1

<context:annotation-config/>
向Spring容器注册AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor这4个BeanPostProcessor。
注册这4个BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。
-对于其他没有在spring容器中注册的bean,它不能起到注册bean的作用。


<context:component-scanbase-package=”xx.xx”/>
可以指定package扫描,
可以自动将带有@Autowired,@component,@service,@Repository等注解的对象注册到spring容器中的功能
隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor


-因此当使用<context:component-scan/>后,除非需要使用PersistenceAnnotationBeanPostProcessor和RequiredAnnotationBeanPostProcessor两个Processor的功能(例如JPA等)否则就可以将<context:annotation-config/>移除了。

虽然大多数文章都是这么说,但是查看spring4的源代码如下:

并且在源码中也发现这个配置也包含了<context:annotation-config/>:

看过传智播客对于spring的说明也是说<context:component-scan/>包含了<context:annotation-config/>。

<context:component-scanbase-package="com.baobaotao">
<context:include-filtertype="regex" expression="com\.baobaotao\.service\..*"/>
<context:exclude-filtertype="aspectj" expression="com.baobaotao.util..*"/>
</context:component-scan>

<mvc:annotation-driven/>
标签可简化springmvc的相关配置,默认情况下其会创建并注册实例:
DefaultAnnotationHandlerMapping:处理器映射器@Controller(默认注册)
AnnotationMethodHandlerAdapter-:处理器适配器
StringHttpMessageConverter
ByteArrayHttpMessageConverter
XmlAwareFormHttpMessageConverter
SourceHttpMessageConverter。
FormattingConversionServiceFactoryBean-:ConversionService类型转换
NumberFormatAnnotationFormatterFactory:@NumberFormat格式化
JodaDateTimeFormatAnnotationFormatterFactory::@DateTimeFormat格式化
LocalValidatorFactoryBean:@Valid数据校验

参考文章:

点击打开链接


2、基础知识2

<annotaion-driven/>标签:
这个标签对应的实现类是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
仔细阅读它的注释文档可以很明显的看到这个类的作用。解析这个文档:
这个类主要注册8个类的实例:
1.RequestMappingHandlerMapping
2.BeanNameUrlHandlerMapping
3.RequestMappingHandlerAdapter
4.HttpRequestHandlerAdapter
5.SimpleControllerHandlerAdapter
6.ExceptionHandlerExceptionResolver
7.ResponseStatusExceptionResolver
8.DefaultHandlerExceptionResolver
1是处理@RequestMapping注解的,2.将controller类的名字映射为请求url。1和2都实现了HandlerMapping接口,用来处理请求映射。
3是处理@Controller注解的控制器类,4是处理继承HttpRequestHandlerAdapter类的控制器类,5.处理继承SimpleControllerHandlerAdapter类的控制器。所以这三个是用来处理请求的。具体点说就是确定调用哪个controller的哪个方法来处理当前请求。
6,7,8全部继承AbstractHandlerExceptionResolver,这个类实现HandlerExceptionResolver,该接口定义:接口实现的对象可以解决处理器映射、执行期间抛出的异常,还有错误的视图。
所以<annotaion-driven/>标签主要是用来帮助我们处理请求映射,决定是哪个controller的哪个方法来处理当前请求,异常处理。


<context:component-scan/>标签:
它的实现类是org.springframework.context.annotation.ComponentScanBeanDefinitionParser.
把鼠标放在context:component-scan上就可以知道有什么作用的,用来扫描该包内被@Repository @Service @Controller的注解类,然后注册到工厂中。并且context:component-scan激活@ required。@ resource,@ autowired、@PostConstruct @PreDestroy @PersistenceContext @PersistenceUnit。使得在适用该bean的时候用@Autowired就行了。主要用于对实体的注解交给spring管理

参考文章:

点击打开链接

3、正题:spring MVC中json格式数据的发送与接收

在web程序开发中,前端和服务器数据的传输方式常用的有两种,一种是以表单的形式提交,此时可以利用jquery的serialize()方法将表单内容转为a=1&b=2&c=3&d=4&e=5这样的格式传输过去,接收端则可以用javabean直接接收。
还有一种方式是以json格式传输,接收时若直接用bean接收则接收不到,此时应该用@RequestBody方式,需要注意的是接收的需要是json串,而不是json对象,可以在发送前使用JSON.stringify函数进行处理。(我用的是google的Gson,效果是一样的)

经过尝试经常出现:

SpringMVC @RequestBody 自动转json Http415错误

经过一通查,多半的解决方法实说header里的 Content-Type 一定 application/json
但是问题依然没有解决。
最后在《Spring in Action》里找到一个信息
有两个前提条件:
The request’sContent-Type header must be set toapplication/json.
The JacksonJSON library must be available on the application’s classpath. 
我满足了第一个,所以在classpath中添加了一个jar。问题解决了。

<dependency>      <groupId>org.codehaus.jackson</groupId>      <artifactId>jackson-mapper-asl</artifactId>      <version>1.9.8</version>      <type>jar</type>  </dependency>  
所以如果大家遇到了同样的问题,可以先排除一下这两个因素。
------------------------------
还有一种情况,在以上两个条件都满足的情况下,还是报同样的错误。
在springmvc的配置文件中必须有:
<!-- 默认的注解映射的支持 -->  <mvc:annotation-driven />  
如果没有这个配置也是会报这个错的!


最后需要注意的是

1,在xxx-serverlet配置文件中应该写上,以便可以使用 @ResponseBody和@RequestBody
2,发送时要写上 contentType:'application/json'
3,数组内容要用[]而不是list,用list会接收到一个map对象,而不是bean

参考文章:

点击打开链接

点击打开链接


如果还是解决不了上述问题,因为我的spring版本比较新是4.+的,而我发现jackson-mapper的最新版本也只是2013年的,因此,我觉得这个方案可能已经被弃用了,因此我加入了这个包:

<dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-databind</artifactId>            <version>2.3.1</version></dependency>
测试是通过的。

其实,最开始我用的是google的Gson,也是可以的。但是查了下资料,大多数测试证明jackson的性能要比gson好,因此准备入手jackson。


对于实体对象的Json形式接收就先写到这里了,下面会开始研究数组形式的接收。

0 0
原创粉丝点击