关于一次MybatisPlus自动配置失效

今天在项目中配置了动态数据源,但是在引入了MybatisPlus后启动项目,却发现所有Mapper和SqlSession等等Bean没有被自动注入到容器中,猜测是自动配置失效,查看源码后发现MybatisPlusAutoConfiguration自动配置类上有注解@ConditionalOnSingleCandidate(DataSource.class),即在容器中只有一个DataSource候选Bean是才会启用自动配置,而我手动在容器中注入了一个主数据源和一个动态数据源,导致自动配置失效。并且由于将主数据源设为了动态数据源的默认数据源,所以最好的解决方案是在动态数据源上添加@Primary注解,让容器优先选择动态数据源

SpringBoot Restful API 自定义错误响应格式

通常我们会通过spring的异常处理器来自定义响应格式,即通过@RestControllerAdvice来实现,但是如果只是为了自定义一个返回格式的话有更好的选择,那就是自定义ErrorController,所有未被处理的异常都会被它处理,@RestControllerAdvice也被视为异常处理,即被@RestControllerAdvice处理的异常将不会到达这里,直接上代码,以Kotlin为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@RestController
@RequestMapping("/error")
class GlobalErrorController : ErrorController {

@Autowired
lateinit var errorAttributes: ErrorAttributes

@RequestMapping
fun error(request: HttpServletRequest): ResponseEntity<ErrorResponse> {
val ex: Throwable? = errorAttributes.getError(ServletWebRequest(request))
val status = getStatus(request)
return ResponseEntity.status(status)
.body(ErrorResponse(status = status.name, message = ex?.localizedMessage ?: ""))
}

private fun getStatus(request: HttpServletRequest): HttpStatus {
val statusCode = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)

if (statusCode !is Int) {
return HttpStatus.INTERNAL_SERVER_ERROR
}

return try {
HttpStatus.valueOf(statusCode)
} catch (e: Exception) {
HttpStatus.INTERNAL_SERVER_ERROR
}
}
}
  • 这里注入了一个ErrorAttributes类型的bean,它包含了请求上下文的错误信息,通过getError方法可以获取到异常类

  • 匹配到路由/error的方法的返回值会作为响应发送到客户端,当然这个路由是可以自定义的

阅读更多

解决Kotlin下使用@Transactional等Spring代理类空指针异常

直接上代码

1
2
3
4
5
6
7
8
9
10
11
open class BaseController<T : BaseEntity>(val baseService: BaseService<T>) {

@Transactional
@AuthRequired
@PatchMapping("/{id}")
open fun updateById(@PathVariable("id") id: Long, @RequestBody entity: T): ResponseEntity<T> {
entity.id = id
return ResponseEntity.ok(baseService.updateById(entity))
}

}

访问controller时出现NullPointerException,此时baseService为null

阅读更多

解决Kotlin项目spring-boot-configuration-processor不生效

在尝试用kotlin写springboot项目时发现springboot的kotlin项目模板的注解处理器没生效,结果就是自定义的配置类在idea中没有语法提示,且有一堆黄线警告,解决方法就是用kapt进行注解处理
在build.gradle.kts加入

1
2
3
4
5
6
7
8
9
plugins {
...
kotlin("kapt") version "1.4.20"
}

dependencies {
...
kapt("org.springframework.boot:spring-boot-configuration-processor")
}

重新构建,这样就能正确生成spring-configuration-metadata.json

阅读更多