Spring Service中的Rest Service输入参数已更改

时间:2016-12-12 10:45:29

标签: java spring rest spring-boot

我现在将我的项目分为三个部分:一个用于美国和美国的核心项目。印度具有可以应用于它们的功能,仅具有美国功能的美国项目,仅具有印度功能的印度项目。

但现在我遇到了春季启动时的问题。在美国,有两个新的文件添加到原始核心实体,因此输入对象从PromSeckillRequest更改为UsPromSeckillRequest,

现在我想覆盖我的seckill界面,我没有好的选择,但先写一个放弃seckill界面,然后编写我想要的另一个seckill界面。代码如下:

@RestController("usShoppingController")
@RequestMapping(value = "/prom", method = RequestMethod.POST)
public class UsPromShoppingController extends PromShoppingController {

@RequestMapping("/seckillAbandon")
@Override
public JsonResponse seckill(@Valid @RequestBody PromSeckillRequest request)    {
    return null;
}

@RequestMapping("/seckill")
public JsonResponse usSeckill(@Valid @RequestBody UsPromSeckillRequest request) {
        return super.seckill(request);
    }
}

但我的目标如下:

@RestController("usPromShoppingController")
@RequestMapping(value = "/prom", method = RequestMethod.POST)
public class UsPromShoppingController extends PromotionShoppingController {

@RequestMapping("/seckill")
@Override
public JsonResponse usSeckill(@Valid @RequestBody UsPromSeckillRequest request) {
        return super.seckill(request);
    }
}

这有什么好的解决方案吗? 我正在使用春季靴子。

修改

我和google一起检查过,发现这是春季启动的一个弱点,直到现在。我不知道为什么春靴不支付这一点的全部支持。我想也许我们可以这样做。

我想添加一个包装器来解决这个问题,但似乎我只能将请求更改为HashMap类型或字符串类型,但这不是我想要的因为它很难有效地输入请求参数。

1 个答案:

答案 0 :(得分:3)

好的,根据我提供的信息,我将尝试猜测您的问题究竟是什么以及如何解决问题:-)

首先,我假设您以某种方式(例如使用配置文件)切换哪个控制器处于活动状态,因为您不能将两个控制器绑定到同一端点。这不是Spring的错,而是与应用服务器内部的路由(例如tomcat)有关。

Soooo ...如果您正在使用配置文件,则可以使用活动配置文件作为限定符,只需使用@Profile注释控制器类并切换使用哪一个。这样就不需要压倒一切。

最重要的是,我强烈建议您删除继承而不是组合。将所有共享逻辑放入一个中心类(如您继承的那个)并将其注入构造函数中。

您的代码可能看起来像这样(我在顶部添加了一些Lombok糖)

@RestController
@PostMapping("/prom")
@Profile("us")
@RequiredArgsConstructor
public class UsShoppingController {

    private final ShoppingController helper;

    @RequestMapping("/seckill")
    public JsonResponse seckill(@Valid @RequestBody UsPromSeckillRequest request) {
        return helper.seckill(request);
    }
}

如果您使用的是旧版本的弹簧启动,则必须向@RequiredArgsConstructor添加onMethod注释或手动编写。

如果您确实需要同时并行运行两个控制器,则必须在应用程序代码中添加一个间接层,该层将根据参数类型进行路由。应用程序服务器无法帮助您。