Re: [問題] Spring的RequestBody

作者: qrtt1 (有些事,有時候。。。)   2016-09-01 12:01:29
※ 引述《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
.[email protected]/*
作者: gmoz ( This can't do that. )   2016-09-01 15:06:00
太棒惹
作者: swallowcc (guest)   2016-09-01 19:47:00
太棒惹
作者: kyleJ (資工人)   2016-09-01 22:52:00
太棒惹 非常感謝熱心教學!!!
作者: NullLife (廢材大叔有點累)   2016-09-02 00:51:00
大推!
作者: lucky1lk (賭到沒錢的人)   2016-09-02 07:08:00
太棒惹 假的!你眼睛業障重啊,怎麼會有
作者: pttworld (批踢踢世界)   2016-09-03 08:25:00
版本發展不曉得是否還流行Validator
作者: givemepass (λ)   2016-09-04 16:15:00
太棒惹
繼續閱讀

Links booklink

Contact Us: admin [ a t ] ucptt.com