Я создаю веб-приложение для сохранения данных, и я добавил Swagger в свой бэкэнд, чтобы определить его контракты с уровнем выше.В Swagger UI, как я могу отправить POST с двумя связанными сущностями, чтобы они оба были сохранены и связаны в базе данных?
Я использую SpringFox-Swagger 3.0.0-Snapshot с spring-boot-starter-data-jpa и spring-boot-starter-data-rest (оба 2.1.2).Я создал 2 объекта, FixFunction и FixCluster.Последний является родителем первого, и между ними есть отображение 1-к-1, и каждый кластер ДОЛЖЕН иметь функцию.Swagger задокументировал конечные точки, автоматически сгенерированные Spring, и я могу добавить функцию FixFunction в базу данных с помощью POST в Swagger.
Но я не могу добавить FixCluster: я получаю исключение, сообщающее, что нет функции для кластера, как если бы функция не сохранялась до кластера, когда я выполняю POST в Swagger.Если я делаю то же самое в Java, оба объекта сохраняются (см. Модульный тест ниже)
Класс FixFunction
@Entity
public class FixFunction {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String functionName;
private String description;
private String hostName;
...
}
Класс FixCluster
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames = {"clusterName" ,
"fix_function_id"})})
public class FixCluster {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String clusterName;
private String description;
private Integer port;
@OneToOne(fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
private FixFunction fixFunction;
...
}
Определение таблицы FixCluster
CREATE TABLE FIX_CLUSTER (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
cluster_name varchar(50) NOT NULL UNIQUE,
description varchar(255),
port integer,
fix_function_id int NOT NULL REFERENCES FIX_FUNCTION(id),
CONSTRAINT UC_Cluster UNIQUE (cluster_name,fix_function_id)
);
JSON POST, который я пробовал в чванстве
{
"clusterName": "Clust1",
"description": "Clust1",
"fixFunction": {
"description": "Func1",
"functionName": "Func1",
"hostName": "Host1",
"id": 1
},
"id": 1,
"port": 10
}
Результирующий скручивание
curl -X POST "http://localhost:8080/fixClusters" -H "accept: */*" -H
"Content-Type: application/json" -d "{ \"clusterName\": \"Clust1\",
\"description\": \"Clust1\", \"fixFunction\": { \"description\": \"Func1\",
\"functionName\": \"Func1\", \"hostName\": \"Host1\", \"id\": 1 }, \"id\":
1, \"port\": 10}"
Сообщение об ошибке
"NULL not allowed for column \"FIX_FUNCTION_ID\"; SQL statement:\ninsert
into fix_cluster (id, cluster_name, description, fix_function_id, port)
values (null, ?, ?, ?, ?)
Проверьте, чтоЯ написал, чтобы подтвердить работоспособность каскада
@Test
public void cascadePersistanceOfFixFunctionWorks() {
FixFunction otherFixFunction = new FixFunction(otherFixFunctionName);
FixCluster cluster = new FixCluster(otherClusterName,
otherFixFunction);
cluster.setDescription(clusterDescription);
cluster.setPort(clusterPort);
clusterRepository.saveAndFlush(cluster);
List<FixCluster> clusters = clusterRepository.findAll();
assertTrue(clusters.size() == 1);
assertEquals(otherFixFunction, clusters.get(0).getFixFunction());
assertTrue(functionRepository.findAll().size() == 2); // A function is
// created when the test starts
}
При отправке POST выше я ожидал, что сначала будет создана функция, затем ее идентификатор добавлен в кластер, прежде чем эта будет вставлена в БД,похоже на то, что происходит в модульном тесте.Я не уверен, если это потому, что я не пишу JSON правильно (я использовал структуру по умолчанию) или это ошибка в Swagger.Любая подсказка будет оценена.
Я разместил рабочий пример моего проекта здесь :