当 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 时。
我有一个带绑定的 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 时。