3.3.7 后台控制器

新建方法

上一小节中前台收到405错误,就是因为同一个url只有@GetMapping("/")getAll方法的映射,允许get方法,而post请求未声明映射,就会被后台拒绝,返回405

所以我们要新建一个post方法的映射。

打开后台,打开我们的TeacherController,再添加一个save方法:

// 该方法只接受访问到该路由的Post请求
@PostMapping("/")
// @RequestBody绑定数据到Teacher实体上
public Teacher save(@RequestBody Teacher teacher) {
    // 调用teacherRepository中的save方法
    return teacherRepository.save(teacher);
}

这里的@PostMapping("/")声明该urlpost请求映射到该方法。

@RequestBody

这里重要的是@RequestBody注解,我们深入学习一下:

{
    "name": "zhangsan",
    "email": "[email protected]",
    "sex": "0",
    "username": "zhangsan"
}

这是我们前台发送给后台的Json数据,该数据是一个具有nameemailsexusername四个属性的对象。

@Entity
public class Teacher {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Boolean sex;

    private String email;

    private String username;
}

这里,前台发送的数据就和我们后台的Teacher实体的属性相匹配,@RequestBody就将传过来的Json数据,绑定到一个Teacher对象上。

save

这里,我们用到了teacherRepository接口中的save方法。

之前我们在获取全部数据时用到了findAll方法,这里的save方法也是为我们写好的。

参数是要保存的对象,会将保存成功后的对象作为返回值返回。

对接

后台方法写完,运行,保证我们的代码没有错误。

2017-11-10 22:32:35.137  INFO 17111 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-11-10 22:32:35.141  INFO 17111 --- [           main] com.mengyunzhi.Application               : Started Application in 3.144 seconds (JVM running for 3.591)

启动前台,打开我们新建的页面,输入测试数据。

点击提交,但是控制台却报了400的错误。

出现错误,不要着急。打开IDEA,我们看看控制台给我们的错误信息:

Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize value of type java.lang.Boolean from String "0": only "true" or "false" recognized; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.lang.Boolean from String "0": only "true" or "false" recognized
 at [Source: java.io.PushbackInputStream@d845505; line: 1, column: 60] (through reference chain: com.mengyunzhi.repository.Teacher["sex"])

无法读取HTTP信息,Json解析失败,无法将String "0"反序列化为Boolean类型,只有truefalse才能被识别。

我们把对象转化为字节序列的过程称为序列化,把字节序列恢复为对象的过程称为反序列化。

这里我们前台传过去的01不能像我们之前ThinkPHP一样自动转换,所以我们将其改为truefalse

修改

我们将男女单选框的value01改为truefalse

<input type="radio" name="sex" value="true" ng-model="data.sex"><input type="radio" name="sex" value="false" ng-model="data.sex">

teacher/create.js中的初始化数据也修改为true

$scope.data = {
    name: '',
    email: '',
    sex: 'true',
    username: ''
};

填写测试数据。

控制台打印success,成功!

最后,我们点击首页,我们看到多了一条数据。

作者:张喜硕

results matching ""

    No results matching ""