2个具有不同配置的@RestController

Fra*_*ard 5 java spring spring-mvc spring-boot

是否可以有两个不同的@RestController在 Springboot 中使用不同的 MappingJackson2HttpMessageConverter?...或者 MappingJackson2HttpMessageConverter 对于 Spring Boot 应用程序中的所有 @RestController 来说是通用的吗?

基本上,目标是使用不同的 MappingJackson2HttpMessageConverter,其中包含不同的 Jackson ObjectMapper,该对象使用 Jackson MixIn 将 id(在 Json 中)重命名为第二个控制器中的 PriceId。

调用第一个控制器会做什么:

http://localhost:8080/controller1/price

{ id: "id", 描述: "描述" }

调用第二个控制器会做什么:

http://localhost:8080/controller2/price

{ PriceId: "id", 描述: "描述" }

问候

@SpringBootApplication
public class EndpointsApplication {

public static void main(String[] args) {
    SpringApplication.run(EndpointsApplication.class, args);
}

@Data // Lombok
@AllArgsConstructor
class Price {
    String id;
    String description;
}

@RestController
@RequestMapping(value = "/controller1")
class PriceController1 {

    @GetMapping(value = "/price")
    public Price getPrice() {
        return new Price("id", "Description");
    }
}

@RestController
@RequestMapping(value = "/controller2")
class PriceController2 {

    @GetMapping(value = "/price")
    public Price getPrice() {
        return new Price("id", "Description");
    }
}

}
Run Code Online (Sandbox Code Playgroud)

GitHub:

https://github.com/fdlessard/SpringBootEndpoints

And*_*eas 4

MappingJackson2HttpMessageConverter对于所有用 注释的控制器来说这是常见的@RestController,但是有一些方法可以解决这个问题。常见的解决方案是将控制器返回的结果包装到标记类中并使用自定义MessageConverter (Spring Hateoas 使用的示例实现)和/或使用自定义响应媒体类型。

TypeConstrainedMappingJackson2HttpMessageConverterwhereResourceSupport是标记类的示例用法。

MappingJackson2HttpMessageConverter halConverter = 
    new TypeConstrainedMappingJackson2HttpMessageConverter(ResourceSupport.class);
halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON));
halConverter.setObjectMapper(halObjectMapper);
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到基于您的代码的工作示例: https ://github.com/AndreasKl/SpringBootEndpoints

PropertyNamingStrategy可以使用自定义序列化器来代替您的Price传输对象。