当 Camel rest-dsl 发生异常时如何编组到 JSON/XML

How to marshal to JSON/XML when an exception occurs with Camel rest-dsl

我有一个带绑定的 REST-dsl camel 路由:json_xml 使用 .type() 和 outType()。当没有异常发生时,它完美地工作。即 json 输入给出 json 输出。 Xml 输入给出 xml 输出。

但是,当我收到 IllegalArgumentException 时,我总是 return XML。我在异常发生时创建了一个 ErrorResponse POJO。对于 json,CONTENT_TYPE 设置为 "application/json"。我如何 return POJO 并在发生异常时让骆驼编组到 JSON/XML(给定 ResBindingMode.json_xml)?

onException(IllegalArgumentException.class)
        .log(LoggingLevel.ERROR, LOGGER, "error")
        .handled(true)
        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(400))
        .setHeader(Exchange.CONTENT_TYPE, exchangeProperty(Exchange.CONTENT_TYPE))
        .bean(errorResponseTranslator);
restConfiguration().component("restlet").port(port).skipBindingOnErrorCode(true)
        .bindingMode(RestBindingMode.json_xml);
    rest("/whatever/api/v1/request")
        .post().type(RequestDto.class).outType(ResponseDto.class)
            .route()
            .setProperty(Exchange.CONTENT_TYPE, header(Exchange.CONTENT_TYPE))
           ...process

ErrorDto:

@XmlRootElement(name = "errorResponse")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class ErrorResponseDto {
  private String errorCode;
  private String message;

  @XmlElement(name = "message")
  public String getMessage() {
      return message;
  }

  public void setMessage(String message) {
      this.message = message;
  }

  @XmlElement(name = "errorCode")
  public String getErrorCode() {
      return errorCode;
  }

  public void setErrorCode(String errorCode) {
      this.errorCode = errorCode;
  }
}

您需要将内容类型显式设置为 XML 然后

 .setHeader(Exchange.CONTENT_TYPE, exchangeProperty(Exchange.CONTENT_TYPE))

应该是

 .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))

错误发生是因为 outType 不是动态的。好像是骆驼虫。即:outType 必须是包含 OK 和 ERROR dto 的 XMLROOT。如果您使用带有 lax=true 的任意元素的 XMLroot(您可以在此处添加 ErrorDto 或 okResponseDto),则可以快速修复此问题。但它确实添加了不需要的元素。现在我们必须实现一个自定义的 contentNegotiator。

这是在使用 skipBindingOnError 设置为 false 时。