RESTFul @Post для независимых однонаправленных отношений @OneToOne - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть две сущности Parent и Child, связанные отношением @OnToOne следующим образом:

public class Child implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @JsonProperty(access= Access.READ_ONLY)
    private Long id;

    @OneToOne(cascade=CascadeType.REMOVE, fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property = "id")
    @JsonIdentityReference(alwaysAsId = true)
    private Parent parent;

    //other attributes
    //setters and getters
}

public class Parent implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @JsonProperty(access= Access.READ_ONLY)
    private Long id;`

    //other attributes
    //setters and getters
}

Я пытаюсь создать метод RESTFul @Post для дочернего объекта, где клиент (конечный пользователь) должен предоставить действительный идентификатор родителя для создания нового дочернего объекта (сначала должен быть создан родительский объект, затем клиент должен предоставить только идентификатор родителя, а не все атрибуты родителя для создания нового потомка).

ниже мой метод сообщения

@POST
@ApiOperation(value = "Add a new child to the database")
@ApiResponses(value = {
    @ApiResponse(code = 201, message = "child created successfully."),
    @ApiResponse(code = 400, message = "Invalid child supplied in request body"),
    @ApiResponse(code = 409, message = "child supplied in request body conflicts with an existing child"),
    @ApiResponse(code = 500, message = "An unexpected error occurred whilst processing the request")
})

public Response createChild(@ApiParam(required = true)Child child) {
    if (child == null) {
        throw new RestServiceException("Bad Request", Response.Status.BAD_REQUEST);
    }

    Response.ResponseBuilder builder;

    try {
        // Go add the new child.
        childService.create(child);

       // Create a "Resource Created" 201 Response and pass the child back in case it is needed.
        builder = Response.status(Response.Status.CREATED).entity(child);
    } catch (ConstraintViolationException ce) {
        //Handle bean validation issues
        Map<String, String> responseObj = new HashMap<>();

        for (ConstraintViolation<?> violation : ce.getConstraintViolations()) {
            responseObj.put(violation.getPropertyPath().toString(), violation.getMessage());
        }
        throw new RestServiceException("Bad Request", responseObj, Response.Status.BAD_REQUEST, ce);
    } catch (Exception e) {
        // Handle generic exceptions
        throw new RestServiceException(e);
    }

    log.info("createChild completed. child = " + child.toString());
    return builder.build();
}

мое JSON-представление для дочернего объекта выглядит примерно так с большим количеством атрибутов (где parent относится к идентификатору родителя)

{
    "Parent": 0,
     ...
}

проблема здесь, когда я тестирую свой метод post, потомок в параметре всегда равен нулю !!, поскольку я пытался получить автоматически сгенерированный идентификатор потомка (child.getId ()), и он равен нулю.

Так, как я могу создать метод post для двух связанных сущностей, где клиент должен предоставить только идентификатор существующей родительской сущности?

...