前言
目前前后端分离后,接口大多数返回给前端的都是json数据,那么我尝试用SpringMVC4的Controller返回json。demo过程中遇到了几个问题写出来和java初学者分享一下。
开发环境
idea2016、jdk1.8、tomcat7
SpringMVC4、jackson2.5
开发问题
1、SpringMVC4如果想返回json的话可以使用ResponseBody、ResponseEntity注解,如果你打算返回注解而没有引用json处理jar包,访问http://localhost:8080/rest/users时会提示http 406。
2、SpringMVC4版本后json序列化必须使用jackson相关,jackson-annotations-2.5.0.jar,jackson-core-2.5.0.jar,jackson-databind-2.5.0.jar。我开始用的fastjson但会报错:
Java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException
项目配置文件
初学Spring,配置文件是最烦神的,概括看来首先下载jar包,你需要关注pom.xml、其次是web.xml、spring-mvc.xml。
1、pom.xml
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.0</version> </dependency> </dependencies>
2、web.xml
<web-app> <display-name>Archetype Created Web Application</display-name> <!-- Spring监听 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>MVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
3、spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 注解驱动 --> <mvc:annotation-driven /> <!-- 扫描包 --> <context:component-scan base-package="com.autohome.controller" /> <!-- 视图解析 --> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <!-- 返回的视图模型数据需要经过jstl来处理 --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="stringConverter" /> <ref bean="jsonConverter" /> </list> </property> </bean> </beans>
OK, 可以编写rest controller了。
@Controller @RequestMapping("/rest") public class RestController { @RequestMapping(value="/sayHello",method = RequestMethod.GET) public @ResponseBody String sayHello(){ return "{"returncode":0,"message":"hello world"}"; } @RequestMapping(value="/users") public ResponseEntity<List<User>> listAllUser(){ List<User> list =new ArrayList<User>(); User user =new User(); user.setId(1); user.setName("test"); user.setAge(30); User user2 =new User(); user2.setId(2); user2.setName("test1"); user2.setAge(30); list.add(user); list.add(user2); return new ResponseEntity<List<User>>(list, HttpStatus.OK); } @RequestMapping(value="/user/{id}",method = RequestMethod.GET) public ResponseEntity<User> getUser(@PathVariable long id){ System.out.println("id:"+id); User user =new User(); user.setId(1); user.setName("test"); user.setAge(30); return new ResponseEntity<User>(user,HttpStatus.OK); } }
输入http://localhost:8080/rest/users、http://localhost:8080/rest/user/1/ ,第一个SpringMVC demo搞定。