我最近将Spring数据添加到我的项目中,然后我发现在我的REST控制器中,客户端提供的模型不再自动从JSON序列化。我该怎么解决这个问题?
我补充道:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
现在User
参数没有调用其String
arg构造函数,并且u
为null!
@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数据构建.war,运行java -jar <path-to-war> --debug
,然后在没有spring数据的情况下构建/运行它,并对输出进行差异处理,则可以看到添加spring数据时包含以下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);
}
}