将Spring Web服务的REST API和实现分离

4

我一直在使用Spring注解,例如@RestController@RequestMapping,在Spring Boot Web应用程序中生成简单的服务。

因此,我已经成功地创建了这个微不足道的示例:

@RestController
public class HelloController {
    @RequestMapping("/")
    public String sayIt() {
        return "Hello!";
    }
}

现在,我想将只包含REST接口和DTO的API库(jar)分离出来。一个或多个单独的库将提供该接口的实际实现。然后,我可以在客户端使用(轻量级)API库生成REST客户端代理以与任何实现进行通信。
那么...有没有注释或配置可以将REST接口与实现分开标记?如果没有,那么除了使用JAX-RS注释之外,有什么Spring的方法可以实现这一点?
@Something1
public class HelloServiceApi {
    @RequestMapping("/")
    public String sayIt();
}

@Something2
public class HelloServiceImpl implements HelloServiceApi {
    public String sayIt() {
        return "Hello!";
    }
}

你的问题有些令人困惑,因为Spring WebMVC系统非常自由形式,缺乏对URL调用方法的任何约束。试图使用Java接口描述RESTful Web Service API在客户端上的外观似乎非常奇怪。 - Affe
@Affe 但是也许Spring Web MVC不适合我。 我在我的服务上有一个明确定义的API契约。 是否有任何Spring的替代方案? - metacubed
2个回答

2

我建议使用一个只包含DTO对象而没有任何逻辑的jar文件。这个jar文件可以被REST服务端和客户端用来传输对象。

客户端不应该依赖于REST war/jar或逻辑。

此外,我会尽量确保我的控制器除了将DTO转换成域模型对象并将其传递给业务逻辑层之外不再持有任何逻辑。


我确实希望从我的API接口自动生成客户端代理。这就是为什么我只需要REST接口而没有任何逻辑。DTO当然是该REST接口的一部分。 - metacubed
那么...你的问题到底是什么? - Luís Soares

1

我认为REST层只应负责外部API、参数处理、发送到下一层(服务层)和准备响应。

也就是说,你应该在服务层拥有不同的实现。这允许API / REST层保持不变和恒定。

服务层(以不同的实现方式提供)应遵守某些通用接口,稍后将其注入上面的REST层。

我有回答您的问题吗?


我理解了...这就是我的实现方式。但是,我仍然希望有一个轻量级的“接口”来生成我的REST客户端代理,例如使用JAXRSClientFactory.create。我不希望客户端依赖于服务器端的REST控制器。 - metacubed
但这就是Web服务的基本原则,无论是REST还是SOAP。要实现技术独立。既然如此,为什么要使用生成的客户端,而不是自定义的客户端?为什么该客户端要依赖于服务器技术?我从未使用过该指令,但在我看来,它应该只依赖于外部可见的REST API,甚至可以是PHP或.NET。 - Luís Soares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接