我有一个带绑定的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;
}
}
答案 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。