您的位置:首页 > 编程语言 > Java开发

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

2015-12-31 15:36 936 查看

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形式接收就先写到这里了,下面会开始研究数组形式的接收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: