第七节:代码开发 -- controller

save

我们删除上节的测试代码,正式开始进行控制器中各触发器的编写。

/SpringMVC/assets/image/chapter3/15.png

package com.mengyunzhi.controller;

import com.mengyunzhi.service.KlassService;
import com.mengyunzhi.repository.Klass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;


/**
 * Created by panjie on 17/4/13.
 */
@RestController
@RequestMapping("/klass")
public class KlassController {
    private final static Logger logger = LoggerFactory.getLogger(KlassController.class);

    @Autowired
    private KlassService klassService;

    @PostMapping("/")
    public Klass save(@RequestBody JsonInput jsonInput) {
        return klassService.save(jsonInput.getName(), jsonInput.getTeacherId());
    }

    private static class JsonInput {
        private String name;
        private Long TeacherId;
    }
}

添加构造函数及set\get方法:

    private static class JsonInput {
        private String name;
        private Long TeacherId;

        public JsonInput() {
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Long getTeacherId() {
            return TeacherId;
        }

        public void setTeacherId(Long teacherId) {
            TeacherId = teacherId;
        }
    }

启动应用并测试:

/SpringMVC/assets/image/chapter3/30.png

查看返回值,发现teacher的值为null,是的,这是由于我们启动程序时,Spring将自动把表清空。所以此时,并没有teacherId为1的实体,Spring在进行班级实体保存时,发现了这一点,进而用null来替代了这个教师实体。

思索:如果避免在测试时teacher返回null呢?

增加验证

我们对用户传入的班级名称进行验证,不能为空,最大长度为10. 加入验证注解:

import org.hibernate.validator.constraints.NotEmpty;
        ...
        @NotEmpty
        @Size(max = 10)
        private String name;

然后,我们在请求的注解中,开启验证

public Klass save(@Valid @RequestBody JsonInput jsonInput) {

启动应用并测试: 输入name为空时:

/SpringMVC/assets/image/chapter3/31.png

输入name过长时:

/SpringMVC/assets/image/chapter3/33.png

小结

我们不仅可以在实体中使用验证,还可以在其它类中使用验证。我们不仅可以将数据直接绑定到实体上,还可以将数据绑定至其它的对象上。

get

/SpringMVC/assets/image/chapter3/14.png

    @GetMapping("/{id}")
    public Klass get(@PathVariable Long id) {
        return klassService.get(id);
    }

测试略。

update

/SpringMVC/assets/image/chapter3/17.png

    @PutMapping("/{id}")
    public Klass update(@PathVariable Long id, @Valid @RequestBody JsonInput jsonInput) {
        return klassService.update(id, jsonInput.getName(), jsonInput.getTeacherId());
    }

delete

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id) {
        klassService.delete(id);
        return;
    }

测试略。

由于每启动一次应用,都用清空数据表。所以在上面的测试过程中,相信你也会得到了很多想不到的异常。原因也很简单,比如你在查询数据前,没有增加这个班级。比如你在增加这个班级前没有先增加一个教师;再比如,你在更新数据前没有新增一个班级。总之,我们发现使用postman测试的时候,好像也并没有那么简单了。

总结

在第二章教师管理中,我们将用户的输入信息,直接绑定到了实体上。本节中,我们将用户的输入信息绑定到了自定义类中,并进行了验证。这是两种不同的数据绑定方式,在实际的开发过程中,我们可以按实际需求进行选择。