知足常乐 俭以养德
reason:如果你想通过controller返回JSON对象给你前端,那么必须为该对象的属性添加get方法
solution: 添加get方法
reason: mybatis mapper文件中的sql语句不正确
solution:修改mapper文件
@ControllerAdvice
以及 @ExceptionHandler
能不或来自controller层的异常,但是postman的response body不是与其格式.像如下代码
@ControllerAdvice
public class ExceptionAspect {
@ExceptionHandler({NewsCategoryExistedException.class, InvalidParamException.class})
public ApiDto handleException(Exception e){
return new ApiDto(e.getMessage());
}
}
当捕获异常后应该返回ApiDto类,但是postman却显示一下内容
{
"timestamp": "2019-10-15T08:23:02.825+0000",
"status": 404,
"error": "Not Found",
"message": "新闻分类名称已存在",
"path": "/newsCategory/add"
}
原因:虽然handleException
返回的时ApiDto类型,但是该方法并未被标记REST方法,所以返回值不能直接转换成JSON
solution:1 声明该类时同时使用@ControllerAdvice
和ResponseBody
;2 使用 @RestControllerAdvice
来声明
小结:如果postman返回404错误,就目前的case来看,是返回给前端的方法未被声明为REST类型,此时注意添加@ResponseBody,或者具有同等作用的annotation,比如@RestControllAdvice
in
场景:将id为2,3的对象的parentId修改为2
<update id="updateCategoryParent" >
update news_category set parentId = #{newParentId} where id in
<foreach collection="oldChildrenIds" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</update>
注意上面的oldChildrenIds
和newParentId
,它必须跟dao对象中的参数名一致
void updateCategoryParent(String[] oldChildrenIds, int newParentId);
5.Springboot中的路径
resources/templates
resources/static
在使用Springboot进行web开发时,会发现上面的两个文件夹:templates和static。关于这两个文件夹的使用,还是有些地方需要注意:
如果你是用了Thymeleaf引擎,而且在application.properties中没有设置spring.thymeleaf.prefix,那么thymeleaf会默认在templates中查到文件,例如index.html,然后根据Controller返回的view名字来呈现页面,如下:
@Controller
public class HomeController {
@Value("${site.title}")
private String message;
@RequestMapping("/")
public String home(Model model){
model.addAttribute("message",message);
return "index";
}
}
注意此时的HomeController声明为@Controller,而不是@RestController,因为我们要返回一个视图,不是简单的JSON数据
但是现在主流的是采用前后端分离技术,也就是说,Controller层只返回数据,不返回视图,这样会带来一个问题,在页面跳转时会发生404错误,例如,在templates文件夹下有如下文件
templates/
–home.html
–news/
——category.html
当我不采用前后端分离,而是在Controller直接返回视图时,我在home.html中使用<a href="news/list">新闻列表</a> 可以直接访问到category.html,注意此时controller中的返回的视图名称时news/list
而当采用前后端分离时,即使你使用<a href="news/category.html">新闻列表</a>也提示找不到页面
此时的解决方案可以这样,创建一个views文件夹,然后把templates中的文件目录拷贝到views下面,然后在application.properties中添加如下设置
spring.thymeleaf.prefix=classpath:/views/
注意views后面必须要带/,此时你就可以使用<a href="news/category.html">新闻列表</a>了,但是带来的不便就是你需要使用ajax来获取REST API返回的数据来填充视图了,而不像上面home方法中所示那样方便处理
所以任何事情都是有利有弊,关键在于你如何平衡,或者说你真正想要是什么