Добавить элемент в массив Json в Spring Boot - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть сущность Tag, как это

@Entity
@Table(name = "tags")
public class Tag {
    @Id
    String name;
    @ElementCollection(fetch = FetchType.EAGER)
    @Column(name = "values")
    Collection<String> values;

    public Collection<String> getValues() {
        return values;
    }

    public void setValues(Collection<String> values) {
        this.values = values;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Я спроектировал эту сущность так, чтобы иметь такой json

{
    "name": "rbb",
    "values": [
        "Rank Banker",
        "Tank Ranker"
    ]
}

У меня есть такой контроллер

@RequestMapping("/tags")
@RestController
public class TagController {
    @Autowired
    TagsRepository tagsRepository;
    @PostMapping("/set")
    private ResponseEntity<CustomResponse> setTags(@RequestParam(value = "tag") String tag, @RequestParam(value = "values") Set<String> values){

        Tag tag1 = new Tag();
        tag1.setName(tag);
        tag1.setValues(values);

        tagsRepository.save(tag1);
        CustomResponse customResponse = new CustomResponse();
        customResponse.setStatus("Success");
        customResponse.setMessage("Successfully saved tag");
        return new ResponseEntity<>(customResponse, HttpStatus.OK);
    }

}

При этом каждый раз, когда я нажимаю на этот API, мои данные будут заменяться.

Я хочу добавить новые значения к последнему json, и, следовательно, я делаю это так

@RequestMapping("/tags")
@RestController
public class TagController {
    @Autowired
    TagsRepository tagsRepository;
    @PostMapping("/set")
    private ResponseEntity<CustomResponse> setTags(@RequestParam(value = "tag") String tag, @RequestParam(value = "values") Set<String> values){
        Optional<Tag> tg = tagsRepository.findById(tag);
        Tag tag1;

        if(!tg.isPresent()){
            tag1 = new Tag();
            tag1.setName(tag);
            tag1.setValues(values);
        }else {
            tag1 = tg.get();
            tag1.getValues().addAll(values);
        }


        tagsRepository.save(tag1);
        CustomResponse customResponse = new CustomResponse();
        customResponse.setStatus("Success");
        customResponse.setMessage("Successfully saved tag");
        return new ResponseEntity<>(customResponse, HttpStatus.OK);
    }

}

Сначала я нахожу, если значение уже присутствует, и, если оно присутствует, я добавляю его в массив. Но я не думаю, что это правильный путь, так как поиск значения становится более утомительным, когда массив большой. Так есть ли другой эффективный способ достичь этого. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 03 апреля 2019

Самый простой способ сделать это - использовать существующие Tag

  Optional<Tag> tg = tagsRepository.findById(tag).orElse(()=>{
        Tag newTag=new Tag();
        newTag.setName(tag);
        newTag.setValues(new HashSet<>());
   });
   //eventually chekc for duplicates and add new values OR
   // change Collection<String> to Set<String> to get rid of the problem
  tg.getValues().addAll(values);

    tagsRepository.save(tg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...