Проблема в том, что публикуемая вами категория не распознается как существующая категория.
Затем вы можете сделать что-то подобное ниже. Во-первых, создайте класс преобразователя Джексона, чтобы настроить десериализацию Json. Я не был уверен, что это Spring, но они таковы, что вы можете затем вставить необходимый репозиторий.
import com.fasterxml.jackson.databind.util.StdConverter;
@Component
public class CategoryConverter extends StdConverter<Integer, PartyCategory> {
@Autowired
private PartyCategoryRepository repo;
@Override
public PartyCategory convert(Integer value) {
return repo.findById(value).get();
}
}
Затем обновите вашу сущность следующим образом, чтобы свойство category
Json было обработано с помощью конвертер создан выше. Обратите внимание, что на самом деле я бы использовал смешивание Джексона для применения этого пользовательского десериализатора, поскольку это позволило бы избежать «загрязнения» класса сущностей инструкциями обработки Json. Вы можете посмотреть, как это сделать.
@Entity
public class Party {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String description;
@ManyToOne
@JoinColumn(name = "category_id")
@JsonDeserialize(converter = CategoryConverter.class) //in real life use a 'mix-in'
private PartyCategory category;
}
Затем вы можете опубликовать JSON, как показано ниже, где мы просто указываем идентификатор существующей категории:
{
"name": "Party A",
"description": "Description of Party A",
"category": 1
}
. Решение использовать встраиваемые модули, как предложено, тогда можно затем четко отделить модель представления от модели объекта, не создавая слой DTO, который, как правило, будет в значительной степени дублировать модель объекта и который потребует утомительного кода отображения для обработки преобразований.