Spring API后端原理及最佳实践

少用查询字符串,使用路径变量获取参数

@GetMapping("/api/user/query/{uid}")
fun queryUser(@PathVariable uid: Int): UserEntity {
    return ...by uid
}

消息转换器

HttpMessageConverter支持对@RequestBody以及@ResponseBody注解的方法的返回值进行处理。
因此有最常用的两种消息转换器:StringHttpMessageConverterMappingJackson2HttpMessageConverterByteArrayHttpMessageConverter也有用武之地。
对了,别忘了重写内容协商,设置Content-Type默认值:

@EnableWebMvc
@ComponentScan(basePackages = ["ctrl"])
class WebConfig : WebMvcConfigurer {
    override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) {
        // 设置Content-Type默认值
        configurer.defaultContentType(MediaType.APPLICATION_JSON)
    }
}

Jackson

SpringMVC在处理Controller方法参数时使用了Spring的参数绑定和类型转换机制,且对于处理以JSON数据格式的请求和响应(@RequestBody和@ResponseBody)采用Jackson来进行序列化和反序列化操作。

override WebMvcConfigurer.configureMessageConverters()
        // Jackson消息转换器
        converters.add(MappingJackson2HttpMessageConverter().apply {
            objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true)
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            log.d("Jackson消息转换器就绪", supportedMediaTypes)
        })

使用HashMap获取POST请求体中的json键值对

HashMap<String, String>是常见的类型,HashMap<Any, Any>的兼容性更高。

参数校验

与其让校验逻辑弄乱我们的处理器方法,还不如使用Spring对Java校验API(Java Validation API,又称JSR-303)的支持。从Spring 3.0开始,在Spring MVC中提供了对Java校验API的支持。
在Spring MVC中要使用Java校验API的话,并不需要什么额外的配置。只要保证在类路径下包含这个Java API的实现即可,比如Hibernate Validator。

Java校验API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有的注解都位于javax.validation.constraints包中。
对应参数添加@Valid注解即可启用验证,如果有校验出现错误的话,那么这些错误可以通过该参数之后声明的Errors对象进行访问,Errors参数必须要紧跟在带有@Valid注解的参数后面,一般来说方法所做的第一件事就是调用Errors.hasErrors()来检查是否有错误。

原文地址:https://www.cnblogs.com/develon/p/12733365.html