楼主:
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]/*