Проблема с сохранением SpringBoot и MongoDB для поля JSONObject внутри POJO - PullRequest
2 голосов
/ 10 июля 2020

У меня есть простое POJO, подобное приведенному ниже. Геттеры и сеттеры опущены для краткости.

@Document(collection = "posts")
public class Post {
    @Id
    public String id;
    
    @Field(name = "author")
    public String author;
    
    @Field(name = "title")
    public String title;
    
    @Field(name = "body")
    public JSONObject body;
    
    public Post() {

    }
    
    public Post(String id, String author, String title, JSONObject body) {
        this.id = id;
        this.title = title;
        this.author = author;
        this.body = body;
    }

И я использую сохранение по умолчанию из MongoRepository, чтобы сохранить свои данные:

import org.springframework.data.mongodb.repository.MongoRepository;

public interface PostRepository extends MongoRepository<Post, String> {

}

Он сохраняется в MongoDB с использованием кодов ниже:

@PostMapping
    public Post addPost(HttpEntity<String> httpEntity) {
        try {
            JSONObject obj = new JSONObject(httpEntity.getBody());

            Post p1 = new Post("123", obj.getString("author"), obj.getString("title"), 
                    obj.getJSONObject("body"));

            return postRepository.save(p1);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Foo Not Found", e);
        }
    }

Когда он сохраняется в MongoDB, он сохраняет поля, которые изначально не находятся в JSON, который я должен сохранить.

Оригинал JSON:

{
   body: {
     blocks: {
        [
           { data: "Data 1", type: "Type 1" },
           { data: "Data 2", type: "Type 2" },
        ]
     },
     version: "1.2.2"
   }
}

Сохранено JSON:

{
   body: {
     map: {
        blocks: {
           myArrayList:
           [
               { map: { data: "Data 1", type: "Type 1" }, _class: "org.json.JSONObject" },
               { map: { data: "Data 2", type: "Type 2" }, _class: "org.json.JSONObject" },
           ],
           _class: "org.json.JSONArray"
        },
        version: "1.2.2"
     }
   }
}

Когда я пытаюсь получить данные, я получаю следующую ошибку:

java .lang .IllegalStateException: Невозможно установить карту свойств, потому что нет установщика, нет иссушения и он не является частью конструктора сохраняемости publi c org. json .JSONObject ()!

Вот как я получаю data:

@GetMapping(path = "/{id}")
    public Post getPost(@PathVariable String id) {
        try {
            Optional<Post> post = postRepository.findById(id);

            return post.orElseThrow();
        } catch (Exception e) {
            e.printStackTrace();
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Foo Not Found", e);
        }
    }

Мой первый вопрос: есть ли способ сохранить объект JSON в MongoDB без дополнительных полей (например, map, myArrayList)?

Во-вторых, как мне получить данные с помощью поля JSONObject в POJO?

Заранее спасибо!

...