Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要为不同的api调用相同的控制器方法';s_Java_Rest_Spring Boot_Design Patterns_Code Cleanup - Fatal编程技术网

Java 需要为不同的api调用相同的控制器方法';s

Java 需要为不同的api调用相同的控制器方法';s,java,rest,spring-boot,design-patterns,code-cleanup,Java,Rest,Spring Boot,Design Patterns,Code Cleanup,我有两个API 1. localhost:8080/myservice/foo/1/0/updatesStatus 2. localhost:8080/myservice/bar/1/0/updatesStatus 我不允许为每个API使用不同的控制器。这两个API都指向同一个控制器方法,我在这里检查了if-else,但是代码看起来很糟糕,有没有更好的方法来处理这个问题 @PostMapping(value = UPDATE_STATUS_API_PATH) public Response u

我有两个API

1. localhost:8080/myservice/foo/1/0/updatesStatus
2. localhost:8080/myservice/bar/1/0/updatesStatus
我不允许为每个API使用不同的控制器。这两个API都指向同一个控制器方法,我在这里检查了if-else,但是代码看起来很糟糕,有没有更好的方法来处理这个问题

@PostMapping(value = UPDATE_STATUS_API_PATH)
public Response updateStatus(@PathVariable("group") String group , @RequestBody UpdateStatusRequest updateStatusRequest, HttpServletRequest request) {
        try {
            if(APIUrl.FOO_GROUP.equals(group)){
               //code spefic to foo
            }
            else{
              //code spefic to bar
            }
            //common code
}
同样的条件检查也必须在服务层上执行。 是否有任何方法可以避免这种条件检查,而无需使用单独的控制器方法

我能想到这一点

为服务创建一个接口

公共接口更新服务{
作废updateStatus(UpdateStatusRequest UpdateStatusRequest);
}
然后创建不同的实现

公共类FooUpdateService实现UpdateService{
作废updateStatus(UpdateStatusRequest UpdateStatusRequest){
//特定于foo的逻辑
}
}
公共类BarUpdateService实现UpdateService{
作废updateStatus(UpdateStatusRequest UpdateStatusRequest){
//特定于条的逻辑
}
}
创建UpdateServiceFactory

公共类更新服务工厂{
@自动连线
私有更新服务fooUpdateService;
@自动连线
私有更新服务fooUpdateService;
公共更新服务getUpdateService(字符串组){
//将if-else逻辑移到这里
if(apirl.FOO_GROUP.equals(GROUP)){
返回fooUpdateService;
}
否则{
//条码
返回barUpdateService;
}
}
}
控制器:

@PostMapping(值=更新\状态\ API \路径)
公共响应updateStatus(@PathVariable(“group”)字符串组,@RequestBody UpdateStatusRequest UpdateStatusRequest,HttpServletRequest){
updateServiceFactory.getUpdateService(组).updateStatus(updateStatusRequest);
//通用代码
}

什么是不允许?谁干的?这是家庭作业吗?这是一个坏主意,你实际上想做的是为内部层“排序api网关”,如果你真的想这样做(没有任何设计)使用
对象
作为请求主体,然后根据条件更新条目
列表vs single
将在热修复中为你节省很多,但不会推荐