如何处理ContraintViolationException和其他异常

时间:2018-10-23 07:30:32

标签: spring-boot jpa apache-camel

我有这样的骆驼路线:

this.from(uri).process(e -> {

    String json = e.getIn().getBody(String.class);

    JsonObject message = gson.fromJson(json, JsonObject.class);
    Status status = gson.fromJson(message.get("data"), Status.class);

    e.getIn().setHeader("JSON_OBJECT", message);
    e.getIn().setBody(status);
}).to(jpaStatusUri).process(e -> {
    JsonObject message = (JsonObject) e.getIn().getHeader("JSON_OBJECT");
    StatusDetails details = gson.fromJson(message.get("data"), StatusDetails.class);
    // If the first route was successfull i can get the id of the inserted entity here (this works)
    details.setStatusId(e.getIn().getBody(Status.class).getId());
    e.getIn().setBody(details);
}).to(jpaDetailsUri);

我将实体Status发送到jpa端点jpaStatusUri。插入该实体,然后在下面的process()方法中创建一个相应的StatusDetails实体,将其statusId设置为先前保存的Status的ID,然后将其发送到{{1} }端点。

jpaDetailsUri实体已成功保存的情况下,这可以按预期工作。如果StatusConstraintViolationException实体的唯一键已经存在,则将引发异常,我将没有正确的Status并且我将无法更新相应的键statusId实体了。

我当然可以在process()方法中处理此问题,但是处理此问题的“骆驼方式”是什么?

1 个答案:

答案 0 :(得分:1)

处理此类问题的一种方法就是使用onException

 onException(ConstraintViolationException.class)
     .process(e -> {e.getIn().setBody(new ErrorObjectJson());})
     .handled(true)

签出documentation

骆驼还提供了try-catch处理异常的方法。