JSON
使用Jackson jar包、@RequestBody、@ResponseBody注解,达到:
1. 请求JSON消息体映射为JAVA对象
2. 返回JAVA对象映射为JSON消息体
Step 1. 导入Jackson jar包:
Step 2. 在Spring MVC配置中加入annotation-driven,该配置可以确保@RequestBody、@ResponseBody、@Valid(用于请求校验)注解可以被解析生效:
Step 3. 配置控制器扫描路径:
Step 3. 此时编写Controller,使用@RequestBody、@ResponseBody注解:
请求校验
请求校验一般包含两个方面的校验:
1. 请求参数的合法性校验,例如格式校验
该类校验可通过在类定义时使用JSR 303进行数据校验,可使用Hibernate Validator,当数据校验有问题时,将会抛出org.springframework.web.bind.MethodArgumentNotValidException。
2. 业务逻辑校验,例如系统规定网上店铺不可重名
该类校验,一般通过定制业务规则校验代码实现,可抛出自定义异常。
Step 1. 导入Hibernate Validator jar包:
Step 2. 在REST API交互使用到的类定义中使用JSR 303数据校验注解,例如:
HTTP Status Code
1. 在Controller的目标方法上通过@ResponseStatus定义成功码,例如需要PUT方法成功时返回204而不是200:
2. 对于通过定制的业务逻辑校验抛出自定义异常的场景,可以在自定义异常类上加上@ResponseStatus定义Status Code,例如:
3. 对于JSR 303进行的数据校验,返回的是400 Bad Request异常,这个一般无需额外定制。
4. 由于本例中要实现:
当异常出现时,需要返回具体的错误提示信息给客户端(见“自定义错误”章节),实际上异常发生时返回的HTTP Status Code也是在该章节的自定义ExceptionHandler类中指定的。
自定义错误
由于HTTP Status Code只能给出一个笼统的错误提示,往往在实际项目中,当错误发生时,需要根据不同的错误返回不同的错误信息,一般包含错误码和错误描述。
对于业务规则校验抛出的自定义异常和JSR 303抛出的MethodArgumentNotValidException,可以定制ExceptionHandler类来进行处理,在其中直接返回自定义的ErrorInfo对象或者通过返回Map的方式实现:
在上例中,在对应的方法上也加上了@ResponseStatus指定了返回的HTTP Status Code,实际上自定义异常类中使用@ResponseStatus注解标识的HTTP Status Code和JSR 303数据校验未通过时设定的HTTP Status Code,都会在此处被覆盖,如果在此处不设置@Response Status,很不幸将会默认返回表示正确的HTTP Status Code,例如200。