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

但是现在我在春季启动时遇到了一个问题。在美国,原始核心实体中添加了两个新文件,因此输入对象从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核对后发现,到目前为止,这是春季靴子的薄弱环节。我不知道为什么Spring Boot在这一点上没有全力支持。我认为也许我们只能这样做。

我想添加一个包装器来解决此问题,但似乎我只能将请求更改为HashMap类型或String类型,但这不是我想要的,因为这将难以验证输入请求参数。

最佳答案

好的,从我掌握的信息中,我将尝试猜测您的问题到底是什么以及如何解决它:-)

首先,我假设您以某种方式(例如使用配置文件)切换哪个控制器处于活动状态,因为您不能将两个控制器绑定到同一端点。这实际上不是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);
    }
}


如果您使用的是旧版本的Spring Boot,则必须在@RequiredArgsConstructor上添加onMethod注释或手动编写。

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

关于java - Spring Boot中更改了Rest Service输入参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41099062/

10-12 06:27