SpringBoot如何反序列化JSON,它何时执行?

时间:2016-03-31 00:53:55

标签: java json spring-boot

我目前正在使用SpringBoot API与MongoRepository进行交互,但我无法理解传递的JSON如何成为Mongo中的存储文档。我目前有一个存储一组用户的简单API:

@Document
@JsonInclude
public class Group {

    @Id
    @JsonView(Views.Public.class)
    private String id;

    @JsonView(Views.Public.class)
    private String name;

    @JsonView(Views.Public.class)
    private Set<GroupMember> groupMembers = new HashSet<>();
}

每个领域都有setter和getter方法,虽然我不知道这些方法的必要性(最后见问题)。

以下是我使用的简单组件:

@Component
@Path("/groups")
@Api(value = "/groups", description = "Group REST")
public class Groups {

    @Autowired
    private GroupService groupService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Get all Groups", response = Group.class, responseContainer = "List")
    @JsonView(Views.Public.class)
    public List<Group> getAllGroups() {
        return groupService.getAllGroups();
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Create a Group", response = Group.class)
    @JsonView(Views.Detailed.class)
    public Group submitGroup(Group group) {
        return groupService.addGroup(group);
    }
}

最后,我有一个服务类:

@Service
public class GroupServiceImpl implements GroupService {

    @Autowired
    private GroupRepository groupRepository;

    @Override
    public Group addGroup(Group group) {
        group.setId(null);
        return groupRepository.save(group);
    }

    @Override
    public List<Group> getAllGroups() {
        return groupRepository.findAll();
    }
}

GroupRespository只是一个扩展MongoRepository<Group,String>

的界面

现在,当我实际调用POST方法时,主体包含:

{
    "name": "group001",
    "groupMembers": []
}

我看到它正确地使用随机Mongo UUID插入此组。但是,如果我尝试在列表中插入GroupMember个对象,则会收到空指针异常。由此,我有两个问题:

  1. SpringBoot(杰克逊?)如何知道从传递的JSON反序列化哪些字段?我在删除getter和setter方法之后对此进行了测试,但它仍然有效。
  2. SpringBoot如何处理嵌套对象,例如类中的Set?我使用List代替Set进行了测试,但它确实有效,但我不知道为什么。我的猜测是,对于在我的类中声明并在我的JSON对象中列出的每个对象,SpringBoot调用一个在幕后神奇地创建的构造函数,并且Set对于该接口不存在。
  3. 假设我坚持使用Set(相同的用户不应该两次出现)。我可以使用哪些工具来使SpringBoot按预期工作?
  4. 在我看来,春天发生的很多事情都是幕后的,这让我很难理解为什么事情会发生作用。不知道为什么工作会使得从头开始构建事物变得困难,这让我感觉好像是在一起攻击一个项目而不是实际设计一个项目。所以我的最后一个问题是,是否有一个指南可以解释幕后的布线?

    最后,这是我第一次使用Spring ...所以请原谅我,如果我的问题完全没有问题,但我会很感激任何答案。

0 个答案:

没有答案