在我们的Web应用程序中,我们有很多REST服务。突然发现我们需要在继续之前修改每个请求中的一个对象。
所以我们假设我们有n
个不同的控制器和REST服务。在每个控制器中,在我们从下一层调用服务之前,我们需要修改请求中的对象。
问题是如何实现这一点而不在控制器内部提供数百个更改......有没有简单的方法来做到这一点?
更新:
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping(path = "/order", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public OrderResponse getOrderData(@RequestHeader HttpHeaders httpHeaders,
@RequestBody OrderDataRequest orderDataRequest) {
// Use here interceptor to modify the object Details
// (inside OrderDataRequest) before below call:
OrderResponse resp = orderService.getOrderData(orderDataRequest);
return resp;
}
@RequestMapping(path = "/cancel/{orderId}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public boolean cancelOrder(@RequestHeader HttpHeaders httpHeaders,
@RequestBody Details details, @PathVariable Integer orderId) {
// Use here interceptor to modify object Details before below call:
return orderService.cancelOrder(details, orderId);
}
}
在每个控制器中,我需要修改对象详细信息,如您所见,可以在第一个示例中的另一个对象内部,或者像第二个选项一样单独存在。
答案 0 :(得分:0)
你应该考虑写一个interceptor,这样可以让你做你想做的事。
您也可以使用AOP来执行此操作..但是,我认为它过于复杂,尤其是当拦截器已经存在这样的解决方案时!
编辑: 其他一些链接:
编辑2: 遵循"之前的建议"从mykong.com example开始,然后根据它的类来编辑你的特定对象(例如):
package com.your.company;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class HijackBeforeMethod implements MethodBeforeAdvice
{
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
for(Object arg : args) {
if(com.your.company.OrderDataRequest.class.isAssignableFrom(arg.getClass())) {
// update you object here
}
}
}
}
答案 1 :(得分:0)
您可以使用Spring AOP实现此目的。使用传统过滤器的另一种选择。