修改每个Web服务调用的对象

时间:2017-11-15 14:28:02

标签: java web-services spring-boot

在我们的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);
    }
}

在每个控制器中,我需要修改对象详细信息,如您所见,可以在第一个示例中的另一个对象内部,或者像第二个选项一样单独存在。

2 个答案:

答案 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
                }
            }
    }
}

- Get response body   - Json To Java

答案 1 :(得分:0)

您可以使用Spring AOP实现此目的。使用传统过滤器的另一种选择。