Springboot Iusse List

1.No converter found for return value of type

reason:如果你想通过controller返回JSON对象给你前端,那么必须为该对象的属性添加get方法
solution: 添加get方法

2.Invalid statement(not found)

reason: mybatis mapper文件中的sql语句不正确
solution:修改mapper文件

3.使用 @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 声明该类时同时使用@ControllerAdviceResponseBody ;2 使用 @RestControllerAdvice来声明

小结:如果postman返回404错误,就目前的case来看,是返回给前端的方法未被声明为REST类型,此时注意添加@ResponseBody,或者具有同等作用的annotation,比如@RestControllAdvice

4.在mybatis中使用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>

注意上面的oldChildrenIdsnewParentId,它必须跟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方法中所示那样方便处理
所以任何事情都是有利有弊,关键在于你如何平衡,或者说你真正想要是什么

发表评论

邮箱地址不会被公开。 必填项已用*标注