【问题标题】:Springboot json to model without default constructorSpring Boot json 在没有默认构造函数的情况下进行建模
【发布时间】:2015-11-27 13:08:58
【问题描述】:

我遇到了一个问题,我想不通。

上下文

我有一个控制器:

@RestController
@RequestMapping("/classroom")
public class ClassroomController {

    @Inject
    private ClassroomManager classroomManager;

    @RequestMapping(value= "", method = RequestMethod.POST)
    public Classroom create(Classroom classroom) {
        ... some checks ...
        return classroomManager.create(classroom);
    }
}

一个模型类:

public class Classroom {

    private Long id;
    private final String name;
    private final RoomCapacity roomCapacity;
    private final Set<RoomEquipment> equipments = new HashSet<>();
    [... No setter, No default constructor ...]



    public Classroom(String name, RoomCapacity roomCapacity) {
        [... some checks ...]
        this.name = name;
        this.roomCapacity = roomCapacity;
    }
}

问题是,我无法以 JSON 格式发送带有 Classroom 的 POST 请求。

当我这样做时,我遇到了这个异常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.ubp.ent.backend.core.model.classroom.Classroom]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.ubp.ent.backend.core.model.classroom.Classroom.<init>()

我的问题是什么

我确实理解错误,我可能会向该类添加一个默认构造函数。
但是Classroom 的观点来自模型,我不想允许默认实例化。

如何让 Spring 能够从 Json 构建?

【问题讨论】:

  • 如果您不想在实体中使用默认构造函数,则需要添加服务 bean 以与视图交换数据
  • 很抱歉,什么是服务 bean?我该如何实现?
  • 我不记得它是什么,但我相信有一个 Jackson 注释可以应用于构造函数,告诉它使用该注释进行反序列化。
  • 那是@JsonCreator 吗?
  • @chrylis 是的,我想通了,它可以工作。但是“reos”解决方案也很棒。

标签: json spring spring-boot


【解决方案1】:

您可以通过为模型类定义 Jackson 自定义反序列化器来实现。 查看下面的链接,了解如何实现和配置它。

http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

http://www.baeldung.com/jackson-deserialization

【讨论】:

    【解决方案2】:

    你需要使用一个HttpMessageConverter,并且接收参数为@RequestBody。

    @RequestMapping(value= "", method = RequestMethod.POST)
    public Classroom create(@RequestBodyClassroom classroom) {
        ... some checks ...
        return classroomManager.create(classroom);
    }
    
    public class ClassroomConverter extends AbstractHttpMessageConverter<Classroom> {
    ...
    }
    
    
    @Configuration
    @EnableWebMvc
    @ComponentScan
    public class WebConfiguration extends WebMvcConfigurerAdapter {
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
            httpMessageConverters.add(new ClassroomConverter(new MediaType("text", "csv")));
        }
    }
    

    这里有一个和你类似的案例

    http://www.beabetterdeveloper.com/2013/07/spring-mvc-requestbody-and-responsebody.html

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2011-11-03
      • 2013-06-07
      • 2010-09-06
      • 2015-11-17
      相关资源
      最近更新 更多