知识来源
在网上的一番搜索后,我大致总结出了几点:
1.@RestController为开发提供了方便☺,在提供json接口时需要的配置操作再也不需要自己配置了。
2.@RestController注解相当于@ResponseBody和@Controller的结合
3.@RestController注解时,返回的是内容实例
上面说到@RestController注解相当于@ResponseBody和@Controller的结合,那么在这里就大致介绍一下这两个注解的作用;
@ResponseBody
在实际操作中我们只需要在Controller层使用@RequestBody注解就可以将对象进行反序列化;而若需要对Controller的方法进行序列化,我们需要在返回值上使用@ResponseBody;也可以将@ResponseBody注解在Controller类上,这样可以将这个类中所有的方法序列化。
@Controller
@Controller是一种特殊化的@Component类,在实际操作中**@Controller用来表示Spring某个类是否可以接受HTTP请求**,她通常与@ResponseBody绑定使用。
@Component
1.把普通POJO(Plain Ordinary Java Object简单的java对象)实例化到spring容器中,相当于配置文件中的
2.泛指组件,当组件不好归类的时候,可以使用@Component注解进行标注
总结来看
用@RestController标记的类表示这是一个RESTful风格的控制器,它可以处理HTTP请求并返回JSON格式的响应。 @RestController注解在处理请求时,会自动将方法的返回值转换为JSON格式的响应体,并返回给客户端。
@RestController
@RequestMapping("/category")
public class CategoryController {
@Autowired
private CategoryService categoryService;
//添加文章的分类
@PostMapping
public Result add(@RequestBody @Validated Category category){
categoryService.add(category);
return Result.success();
}
}
Service层
//新增文章分类
@Override
public void add(Category category) {
//补充属性值
category.setCreateTime(LocalDateTime.now());
category.setUpdateTime(LocalDateTime.now());
Map<String ,Object> map = ThreadLocalUtil.get();
Integer userId =(Integer) map.get("id");
category.setCreateUser(userId);
categoryMapper.add(category);
}
Mapper层
//新增文章分类
@Insert("insert into category (category_name,category_alias,create_user,create_time,update_time) " +
"values (#{categoryName},#{categoryAlias},#{createUser},#{createTime},#{updateTime})")
void add(Category category);
//获取文章分类的列表
@GetMapping
public Result<List<Category>> list(){
List<Category> categoryList= categoryService.list();
return Result.success(categoryList);
}
@Override
public List<Category> list() {
Map<String,Object> map = ThreadLocalUtil.get();
Integer userId = (Integer) map.get("id");
return categoryMapper.list(userId);
}
//展示文章分类
@Select("select * from category where create_user=#{userId};")
List<Category> list(Integer userId);
测试结果
//获取文章的详细信息
@GetMapping("/detail")
public Result<Category> detail(Integer id){
Category category=categoryService.findById(id);
return Result.success(category);
}
//根据id查询分类的信息
@Override
public Category findById(Integer id) {
Category category=categoryMapper.findById(id);
return category;
}
//根据id查询文章的分类信息
@Select("select * from category where id=#{id}")
Category findById(Integer id);
@Data
public class Category {
@NotNull(groups =Update.class)
private Integer id;//主键ID
@NotEmpty(groups = {Add.class,Update.class})
private String categoryName;//分类名称
@NotEmpty(groups = {Add.class,Update.class})
private String categoryAlias;//分类别名
private Integer createUser;//创建人ID
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;//创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;//更新时间
//定义分组
public interface Add{
}
public interface Update{
}
}
//如果某个校验项没有指定分组,那么他就属于默认分组
//分组之间可以继承,A extends B 那么A就拥有B的所有校验项
依据以上两个规则,我们可以做对代码进行优化
//如果某个校验项没有指定分组,那么他就属于默认分组
//分组之间可以继承,A extends B 那么A就拥有B的所有校验项
//定义分组
public interface Add extends Default {
}
public interface Update extends Default{
}
@RequestMapping
public Result addArticle(@RequestBody @Validated Article article){
articleService.addArticle(article);
return Result.success();
}
``
```java
@Documented//元注解
@Target({FIELD})
@Retention(RUNTIME)//元注解
@Constraint(validatedBy = {StateValidation.class})//提供校验规则的类
public @interface State {
//提供失败后的提示信息
String message() default "state参数只能是已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//负载,获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
@Data
public class Article {
private Integer id;//主键ID
@NotEmpty
@Pattern(regexp = "^\\S{1,10}$")
private String title;//文章标题
@NotEmpty
private String content;//文章内容
@NotEmpty
@URL
private String coverImg;//封面图像
@State
private String state;//发布状态 已发布|草稿
@NotNull
private Integer categoryId;//文章分类id
private Integer createUser;//创建人ID
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
public class StateValidation implements ConstraintValidator<State,String> {
/**
*
* @param value 将来要校验的数据
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (value==null){
return false;
}
return value.equals("已发布") || value.equals("草稿");
}
}