包含Spring Data会破坏Spring Boot应用程序中的自动序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包含Spring Data会破坏Spring Boot应用程序中的自动序列化相关的知识,希望对你有一定的参考价值。

我最近在我的项目中添加了Spring-data,然后我发现在我的REST控制器中,客户端提供的模型不再是从JSON自动序列化的。我怎样才能解决这个问题?

我补充说:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

现在User param没有它的String arg构造函数调用和u是空的!

@PostMapping()
@ResponseBody
public User createUser(HttpServletRequest request, @RequestParam("user") User u) {

    log.info("Got user! " + u);

    users.save(u);
    Optional<User> found = users.findById(u.getEmail());
    log.info("Saved user!! ");

    return found.get();
}
答案

如果使用spring-data构建.war,运行java -jar <path-to-war> --debug然后构建它/运行它而不使用spring-data并对输出进行差异,可以看到添加spring-data时包含以下bean。

  SpringDataWebAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.data.web.PageableHandlerMethodArgumentResolver', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition)
      - found ConfigurableWebEnvironment (OnWebApplicationCondition)
      - @ConditionalOnMissingBean (types: org.springframework.data.web.PageableHandlerMethodArgumentResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)

   SpringDataWebAutoConfiguration#pageableCustomizer matched:
      - @ConditionalOnMissingBean (types: org.springframework.data.web.config.PageableHandlerMethodArgumentResolverCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)

   SpringDataWebAutoConfiguration#sortCustomizer matched:
      - @ConditionalOnMissingBean (types: org.springframework.data.web.config.SortHandlerMethodArgumentResolverCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)

这是因为Spring数据公开了连接到您的数据存储库的REST控制器,如下所述:http://spring.io/projects/spring-data-rest,这打破了序列化传递给REST控制器的对象的默认自动配置。

只需排除自动配置,您现有的自动序列化就可以了:

@SpringBootApplication(exclude = { SpringDataWebAutoConfiguration.class })
public class MyApplication{

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

以上是关于包含Spring Data会破坏Spring Boot应用程序中的自动序列化的主要内容,如果未能解决你的问题,请参考以下文章

为啥 spring-boot-starter-jdbc 会破坏我的 REST 端点?

当加载 spring-boot 和 spring-data-jpa 时,Hibernate 无法加载 JPA 2.1 Converter

如何防止使用带有 Thymeleaf 的 Spring Security 破坏 CSS 格式?

将 UTF8 输入从 JSP 表单传输到 Spring 控制器会破坏元音变音[重复]

包含 Spring Data 时出现 Spring STS 错误

在 Java 9 中删除 sun.misc.Unsafe 将破坏 Spring、Hibernate