我现在将我的项目分为三个部分:一个用于美国和美国的核心项目。印度具有可以应用于它们的功能,仅具有美国功能的美国项目,仅具有印度功能的印度项目。
但现在我遇到了春季启动时的问题。在美国,有两个新的文件添加到原始核心实体,因此输入对象从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类型或字符串类型,但这不是我想要的因为它很难有效地输入请求参数。
答案 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注释或手动编写。
如果您确实需要同时并行运行两个控制器,则必须在应用程序代码中添加一个间接层,该层将根据参数类型进行路由。应用程序服务器无法帮助您。