【问题标题】:WebMvcConfigurationSupport produce errors in SpringBootWebMvcConfigurationSupport 在 SpringBoot 中产生错误
【发布时间】:2020-04-03 19:17:39
【问题描述】:

我正在对我的 rest api 进行版本控制。我在这里找到了一个很好的方法:

https://github.com/augusto/restVersioning

@RestController
@RequestMapping("/user")
@VersionedResource(media = Version.MEDIA)
public class UserController {

    @Autowired
    private UserService userService;


    @GetMapping("")
    @VersionedResource(from = "1.0", to = "1.9")
    public String getUser() {
        return "user v1";
    }

    @GetMapping("")
    @VersionedResource(from = "2.0")
    public String getUserV2() {
        return "user v2";
    }

效果很好,但要做到这一点,需要一个扩展 WebMvcConfigurationSupport 的类:

@Configuration
public class WebConfiguration extends WebMvcConfigurationSupport {
    @Autowired
    private ContentNegotiationManager contentNegotiationManager;

    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        VersionRequestMappingHandlerMapping handlerMapping = new VersionRequestMappingHandlerMapping();
        handlerMapping.setOrder(0);
        handlerMapping.setRemoveSemicolonContent(false);
        handlerMapping.setContentNegotiationManager(contentNegotiationManager);

        return handlerMapping;
    }
}

这会产生许多奇怪的错误,例如新的 LazyInitializationException、更改日期格式、带有 uri 参数的错误......即使我将这个类留空,它也会产生错误并且版本控制将被禁用。当我评论这个 extends WebMvcConfigurationSupport 时,一切都会再次运行良好,当然,版本控制是禁用的。所以我确定错误来自这里。

所以问题是,为什么 WebMvcConfigurationSupport 会产生错误,我有哪些解决方案?谢谢

【问题讨论】:

  • 您是否尝试过 DelegateMvcConfig?
  • 是的,同样的奇怪行为

标签: spring rest spring-boot spring-mvc versioning


【解决方案1】:

解决方案是使用WebMvcRegistrations 而不是WebMvcConfigurationSupport,因为它会禁用自动配置。

 @Configuration
public class WebConfiguration implements WebMvcRegistrations {

    @Autowired
    private ContentNegotiationManager contentNegotiationManager;

    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        VersionRequestMappingHandlerMapping handlerMapping = new VersionRequestMappingHandlerMapping();
        handlerMapping.setOrder(0);
        handlerMapping.setRemoveSemicolonContent(false);
        handlerMapping.setContentNegotiationManager(contentNegotiationManager);

        return handlerMapping;

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2019-07-04
    • 2019-06-05
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2016-03-29
    相关资源
    最近更新 更多