作者qrtt1 (有些事,有时候。。。)
看板java
标题Re: [问题] Spring的RequestBody
时间Thu Sep 1 12:01:29 2016
※ 引述《kyleJ (资工人)》之铭言:
: 大家好,扣除回文之外,这是我第一次在PTT上发文
: 若有不恰当的地方还请多多指教,谢谢
: 之前我用Java都是Java SE的部分比较多
: 主要做网页爬虫,连接档案系统或DB储存与分析资料
: 也有写Swing或JavaFX做GUI给User
: 但Java EE的部分就没什麽接触了
: 以前为了一个国科会案子有自己土法写JSP/Servlet
: 有维护过AXIS2产生的WebService的Server code
: 除此之外好像没什碰到Java EE的东西
: 後来我写网页服务应用都以PHP为主
: 再配合CodeIgniter的MVC框架才了解到MVC的好
: 所以最近要准备以Java写RESTful服务决定研究Spring+Hibernate
: 首先是Spring的部分照着spring.io的训练做真是吓人的好用
: Hibernate的存在更是让我觉得之前浪费了很多生命写业务逻辑外的程式...
: 抱歉,前言好像多了点
: 在Spring上我使用RestController来写控制器
: 也用过RequestBody来让Client直接丢JSON变成Java物件使用
: 如一个新增User到资料库的服务:
: @RequestMapping("/add")
: public ResultBean addUser(@RequestBody User user){
: // 先检查user不为null
: // 再检查user里面所有field都不是null
: // 再把user丢去hibernate储存
: // 返回自订的Result物件让Sprint自动转为JSON
: }
: 这边收到user第一件要做的事情检查是user不是nulll
: 第二件要检查是不是user的所有field都非null
: update的服务也是如此,而其他物件的add、update也都必须要做
: 这是事先订好的,field可以是空字串,但不能是null
: 这部分我有写一个运用反射自动检查所有field的工具
: 丢任何物件进去都能检查有哪些field,以及是否全部都非null
: 但我好奇有没有方法让Spring自动检查RequestBody?
: 或是把Body转为物件後,先经过我写的程式检查再呼叫mapping的method?
: 若是Servlet我会override service method先检查
: 没问题後再让他转去doXXX方法执行
: 但对Sprint不熟不知道该怎麽做
: 上网查询查到比较多Struts2的资讯
: 想在此请问各位前辈们,感谢!
Spring 在 4.2? 後引新了一个方便的新功能
RequestBodyAdvice
http://bit.ly/2bDmmWP
直接看 code :P
@ControllerAdvice
@Component
public class DoSomethingWithRequestBodyObject
extends
RequestBodyAdviceAdapter {
@Override
public boolean supports(MethodParameter methodParameter,
Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
return
methodParameter.hasParameterAnnotation(RequestBody.class)
&&
User.class.equals(methodParameter.getParameterType());
}
@Override
public Object afterBodyRead(Object body,
HttpInputMessage inputMessage,
MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
// 这里就放你的 reflection tool 吧
if (body instanceof User) {
User user = (User) body;
if (user.getFoo() == null) {
user.setFoo(
"假的!你眼睛业障重啊,怎麽会有 null 的值呢?");
}
}
return body;
}
}
==========================================================================
有正确宣告 bean 或被 scan 到就会出现 log
s.w.s.m.m.a.RequestMappingHandlerAdapter :
Looking for @ControllerAdvice: org.springframework.boot.context.embedded
.AnnotationConfigEmbeddedWebApplicationContext@31d7b7bf
s.w.s.m.m.a.RequestMappingHandlerAdapter :
Detected RequestBodyAdvice bean in doSomethingWithRequestBodyObject
==========================================================================
qrtt1$ curl -H "Content-Type: application/json" -X POST -d '{}'
http://127.0.0.1:8080/addUser | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 75 0 73 100 2 299 8 --:--:-- --:--:-- --:--:-- 299
{
"foo": "假的!你眼睛业障重啊,怎麽会有 null 的值呢?"
}
qrtt1$ curl -H "Content-Type: application/json" -X POST -d '{"foo":"太棒惹"}'
http://127.0.0.1:8080/addUser | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 38 0 19 100 19 3170 3170 --:--:-- --:--:-- --:--:-- 3800
{
"foo": "太棒惹"
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 211.21.157.224
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1472702492.A.FCE.html
1F:推 gmoz: 太棒惹 09/01 15:06
2F:推 swallowcc: 太棒惹 09/01 19:47
3F:推 kyleJ: 太棒惹 非常感谢热心教学!!! 09/01 22:52
4F:推 NullLife: 大推! 09/02 00:51
5F:→ lucky1lk: 太棒惹 假的!你眼睛业障重啊,怎麽会有 09/02 07:08
6F:→ pttworld: 版本发展不晓得是否还流行Validator 09/03 08:25
7F:推 givemepass: 太棒惹 09/04 16:15