Как каскадировать сохранение связанных объектов из POST в Swagger (JSON)? - PullRequest
0 голосов
/ 03 февраля 2019

Я создаю веб-приложение для сохранения данных, и я добавил 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.Любая подсказка будет оценена.

Я разместил рабочий пример моего проекта здесь :

...