合并两个api'

时间:2017-03-07 19:37:28

标签: java spring

如何合并两个具有不同输入参数和输出值的外部API?他们希望新的合并控制器向后兼容。我不相信它可以查看现有代码。我认为有人必须改变输入和结果

package package1

@ResponseBody
@RequestMapping(method = RequestMethod.POST)
public class SearchController {
    public ResponseEntity<String> request(@RequestBody String jsonSearch) {
        Search1 search = gson.fromJson(jsonSearch, Search1.class);
        List<Result1> results = search(search);
        return renderSuccess(results);
    }

    public static List<Result1> search(Search1 search) {....}

}

public class Search1 {
    private Calendar date;
    private Foo foo
}

public class Result1 {
    private Bar foo;
}

package package2

@RequestMapping(method = RequestMethod.POST)
public class SearchRestful {
    public ResponseEntity<Bar> request(@RequestBody String jsonSearch2, @RequestParam(value = "limit") int limit) {
        Search2 search2 = gson.fromJson(jsonSearch2, Search2.class);
        Search1 search1 = transform(search2);
        // Yes it really calls the search in the other package
        List<Result1> results = SearchController.search(search1);
        List<Result2> results2 = transformResults(results);
        List<Result2> filteredResults2 = filter(results2, limit);
        return renderSuccess(filteredResults2);
    }
}

public class Search2 {
    private Date date;
    private String foo
}

public class Result2 {
    private Foo foo;
}

我需要在不同的包中创建一个新的

package package3

@ResponseBody
@RequestMapping(method = RequestMethod.POST)
public class SearchController {
    // ?????
}

我应该使用多种方法为大约8个不同的控制器执行此操作。关于如何合并并保持向后兼容性的任何想法?他们想要弃用旧的并开始使用新的组合。它仅由我公司创建的应用程序使用,目前没有外部客户端应用程序使用api,但我相信他们想要这就是为什么他们希望清理它。

我告诉我的老板我们应该创建一个新的,修复所有在两者中完成的奇怪事情但不尝试使package3向后兼容两者。弃用package1和package2(保留它但不再更新)并告诉人们他们是否需要更改,他们必须移动到package3并且只让新应用程序连接到package3。

1 个答案:

答案 0 :(得分:0)

只需按原样保留旧的控制器,并添加具有不同端点的新控制器。

编辑:您可以通过将参数限制设置为不需要来合并这两种方法,并使用框装整数键入它:

  

@RequestParam(value =“limit”,required = false)整数限制

这样,您可以检查何时设置限制,如果是,则SearchRestful,否则SearchController行为。但是上帝,这段代码真是废话,需要一个好的重构。 :(