Задать вопрос
Chvalov
@Chvalov

Как передать JsonArray в spring boot JPA?

Есть JSON который отправляю POST запросом:
[
  {
    "name": "Accept-Language",
    "headerValuesEntityList": [
      {
        "value": "de"
      },
      {
        "value": "de-CH"
      },
      {
        "value": "en-US"
      }
    ]
  },
  {
    "name": "Cookie",
    "headerValuesEntityList": []
  },
  {
    "name": "Trailer",
    "headerValuesEntityList": [
      {
        "value": "Expires"
      }
    ]
  }
]


Controller
@PostMapping("/header/new")
    public boolean save(@RequestBody HeaderEntity headerEntity) {
        headerService.save(headerEntity);
        return true;
    }
Entity:
Header
@Entity
@Table(name = "header")
public class Header {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(length = 128, nullable = false, unique = true)
private String name;

@Column(length = 512)
private String description;

@OneToMany(cascade = CascadeType.ALL)
private List headerValuesList;
HeaderValues
@Entity
@Table(name = "header_value")
public class HeaderValuesEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 512)
    private String value;

    @Column(length = 512)
    private String description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "header_id")
    private Header header;

    public HeaderValues(){
    }
Service:
HeaderService
public interface HeaderService {

    List<HeaderEntity> findAll();
    List<HeaderEntity> findByNameContaining(String name);

    boolean save(HeaderEntity headerEntity);
}
HeaderServiceImpl
@Service
public class HeaderServiceImpl implements HeaderService {

    private HeaderRepository headerRepository;

    @Autowired
    public HeaderServiceImpl(HeaderRepository headerRepository){
        this.headerRepository = headerRepository;
    }

    public List<HeaderEntity> findAll() {
        return headerRepository.findAll(); // todo добавить сортировку или возможность сортировки
    }

    @Override
    public List<HeaderEntity> findByNameContaining(String name){
        return headerRepository.findByNameContaining(name);
    }


    public boolean save(Header header) {
        if (headerEntity == null) return false;
        headerRepository.save(header);
        return true;
    }

}
При отправке Json-а что выше получаю такую ошибку:
JSON parse error: Cannot deserialize instance of `xxx.model.autocomplete.Header` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `xxx.model.autocomplete.Header` out of START_ARRAY token\n at [Source: (PushbackInputStream); line: 1, column: 1]


Если только каскадные данные - тогда работает

Если отправлять вот такой json
{
    "name": "Accept-Language",
    "headerValuesEntityList": [
      {
        "value": "de"
      },
      {
        "value": "de-CH"
      },
      {
        "value": "en-US"
      }
    ]
  }
тогда все работает
как отправлять пачку значений, а не по одному кормить ?
  • Вопрос задан
  • 422 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@light___soul
Full Stack Middle Web Developer
Попробуй так

@PostMapping("/header/new")
    public boolean save(@RequestBody List<HeaderEntity> headerEntityList) {
            for (HeaderEntity headerEntity: headerEntityList) {
                headerService.save(headerEntity);
            }
  
        return true;
    }


или принимай как Hashmap или Object
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы