Spring boot笔记(二)

Spring boot Restful API返回JSON

首先贴一个完整项目目录图,方便后面分析

一、 先打开Mysql,然后创建一个数据库zyuser,然后创建一个表zyuser_user

1
2
3
4
5
6
7
CREATE TABLE `zyuser_user` (
`userid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(50) DEFAULT NULL COMMENT '邮箱(可用于登陆)',
`realname` varchar(10) DEFAULT NULL,
`gender` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=1000000401 DEFAULT CHARSET=utf8;

二、 定义2个model,一个是用户User,一个是用来展示错误的Error
User类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class User {
private String userid;
private String email;
private String realname;
private int gender;

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getRealname() {
return realname;
}

public void setRealname(String realname) {
this.realname = realname;
}

public int getGender() {
return gender;
}

public void setGender(int gender) {
this.gender = gender;
}

@Override
public String toString() {
return "User{" +
"userid='" + userid + '\'' +
", email='" + email + '\'' +
", realname='" + realname + '\'' +
", gender=" + gender +
'}';
}
}

三、 我们定义1个service层即Dao,数据库操作层UserDao接口

1
2
3
4
5
6
public interface UserDao {

@Select("select userid, email, realname, gender from zyuser_user where userid=#{id}")
User getUser(int id);

}

这里大家还记得在第一节中提到的application.porperties中定义的mybatis配置属性吗?

1
2
3
4
5
6
7
8
9
spring.datasource.url=jdbc:mysql://localhost:3306/zyuser?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#Mybatis注解扫描的包路径
mybatis.typeAliasesPackage=com.hackyang.springbootdemo.service
#这里没通过mybatis的mapper.xml文件映射,就注释掉,如果用到xml的话这里就要打开,指向mybatis的mapper.xml文件所在目录
#mybatis.mapperLocations=classpath:mapper/*.xml

我们这里指向IserDao所在的package目录即可。
另外,还要在Application的入口文件上增加@MapperScan注解,指向扫描的Dao目录

1
2
3
4
5
6
7
8
@SpringBootApplication
@MapperScan("com.hackyang.springbootdemo.service")
public class SpringbootdemoApplication {

public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}

四、 最后回到UserController类上,这里大家应该很熟悉了,我就贴上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class UserController {

@Autowired
private UserDao userDao;

@RequestMapping("/user/{id}")
User getUser(@PathVariable int id) throws NullPointerException {
User user = userDao.getUser(id);
if (user == null)
throw new NullPointerException("用户不存在");
return user;
}
}

解释下代码,@RestController被称为构造型(stereotype)注解。它为阅读代码的人提供暗示(这是一个支持REST的控制器),对于Spring,该类扮演了一个特殊角色,由于设计的是restful风格的api,因此支持PathInfo模式,通过@Autowired注入userDao,然后Mybatis帮我们完成一系列的数据库操作,在getUser函数中返回一个User对象,为了返回一个Json对象我们需要在pom文件中引入jackson库。

1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.1</version>
</dependency>

这样Controller就能直接返回json字符串,因为配置了jackson处理器,spring会帮我们自动转换,是不是很简单呀!
好了我们测试一遍,先运行起来spring boot,然后在浏览器访问:http://localhost:8080/user/115

可以看到访问成功,并返回了json字符串。


补充

这里大家要注意到我定义了一个Exception拦截处理器RestException,用来处理错误的请求,同时要将错误的信息以json格式返回给客户端。

Spring统一规范处理错误异常,我们在RestException中引入@ControllerAdvice,专门用来拦截所有的异常,看下RestExceptiond的代码

1
2
3
4
5
6
7
8
9
10
11
12
@ControllerAdvice
public class RestException {

@ExceptionHandler(NullPointerException.class)
@ResponseBody
public Error handlerJDBCException(NullPointerException e) {
Error error = new Error();
error.setMessage(e.getMessage());
error.setCode(200);
return error;
}
}

注解了一个Exceptionhandler用来定义可以处理的Exception,由于在UserController中当用户为null的时候抛出了NullPointerException,这样这里就可以捕获到,另外注解了一个@ResponseBody这样返回一个实体给客户端。
我们再测试下请求一个不存在的用户,客户端就会收到一个Error json字符串。如下图所示:

这在处理客户端响应信息的时候是非常有用的。

王洋 wechat
我的微信号,欢迎交流~

热评文章