如何使用Camel rest-dsl

时间:2017-06-29 13:07:57

标签: json rest apache-camel marshalling

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

但是,当我收到IllegalArgumentException时,我总是返回XML。我发生异常时创建一个ErrorResponse POJO。对于json,CONTENT_TYPE设置为“application / json”。当异常发生时(给定ResBindingMode.json_xml),如何返回POJO并让camel marhal为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;
  }
}

2 个答案:

答案 0 :(得分:0)

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

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

应该是

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

答案 1 :(得分:0)

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

这是使用skipBindingOnError时设置为false。