具有两种 MVC 配置的 Spring Boot

标签 spring spring-mvc spring-boot

我有一个带有 REST API 的 Spring Boot 应用程序,使用 Jackson 进行 JSON View 配置。它工作得很好,我可以获得 Spring Boot 的所有优点。

但是,我需要添加一个类似但具有不同设置的附加 REST API。例如,除其他外,它需要不同的 Jackson 对象映射器配置,因为 JSON 看起来会有很大不同(例如,没有 JSON 数组)。这只是一个例子,但有很多不同之处。每个 API 都有不同的上下文(例如/api/current 和/api/legacy)。

理想情况下,我希望将两个 MVC 配置映射到这些不同的上下文,而不必放弃启动时的任何自动连接。

到目前为止,我所能接近的只是使用两个调度程序 servlet,每个 servlet 都有自己的 MVC 配置,但这会导致 Boot 丢弃我自动获得的一大堆东西,并且基本上破坏了使用 boot 的原因。

我无法将应用拆分为多个应用。

“你不能用 Boot 做到这一点并且仍然获得它的所有魔力”的答案是一个可以接受的答案。看来它应该能够处理这个问题。

最佳答案

有几种方法可以实现这一目标。根据您的要求,我说这是管理 REST API 版本的案例。 有几种方法可以对 REST API 进行版本控制,其中一些流行的是版本 url 和评论链接中提到的其他技术。 基于 URL 的方法更倾向于拥有多个版本的地址:

例如 对于 V1:

/path/v1/resource

和 V2:

/path/v2/resource

这些将解析为 Spring MVC Controller bean 中的 2 个不同方法,调用被委托(delegate)给这些方法。

解决API版本的另一个选项是使用 header ,这种方式只有URL,基于版本的多种方法。 例如:

/path/resource

标题:

X-API-Version: 1.0

标题:

X-API-Version: 2.0

这也将在 Controller 上的两个单独操作中解决。

现在这些是可以处理多个 rest 版本的策略。

下面对上述方法进行了很好的解释:git example

注意:以上是一个spring boot的应用。

这两种方法的共同点是需要不同的 POJOS,基于哪个 Jackson JSON 库自动将指定类型的实例编码为 JSON。

即假设代码使用 @RestController [org.springframework.web.bind.annotation.RestController]

现在,如果您的要求是具有不同的 JSON 映射器,即不同的 JSON 映射器配置,那么无论 Spring 上下文如何,您都需要不同的序列化/反序列化策略。

在这种情况下,您需要实现自定义反序列化器 {CustomDeSerializer},它将扩展 JsonDeserializer<T> [com.fasterxml.jackson.databind.JsonDeserializer]deserialize()实现您的自定义策略。

使用 @JsonDeserialize(using = CustomDeSerializer.class)目标 POJO 上的注释。

这样可以使用不同的反序列化器管理多个 JSON 方案。

通过结合 Rest 版本控制 + 自定义序列化策略,每个 API 都可以在其自己的上下文中进行管理,而无需连接多个调度程序 Servlet 配置。

关于具有两种 MVC 配置的 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728814/

相关文章:

java - Tomcat 或 Jetty 上的 Spring Web 应用程序 Controller 内基于事件的编程

java - 将 JVM 参数添加到 Spring Boot 应用程序

java - 使用 Spring Security 保护应用程序不起作用

java - spring 外部属性文件;文件未找到异常

java - 使用 spring java 进行微米度量(无 spring boot)

java - 从spring-boot-admin-server 1.4.6升级到1.5.2后的RestClientException

java - 在基于 Java 的 Spring 配置中具有多个构造函数的 Bean

java - Hibernate - 查询为实体中的所有字段返回空值,而同一查询从数据库中完美返回

java - 在 singletonlist 中发送 elementcollection

java - 使用嵌入式 MongoDb 启动 Spring boot 时出现异常