Apache camel: XML 파일을 JSON 파일로.
나는 며칠 전에 Apache Camel을 배우기 시작했고 XML 파일에서 JSON 파일을 생성하는 간단한 경우에 어려움을 겪고 있었습니다.
문제 1: 이전 버전
수강하던 과정에서 프로젝트를 선택했습니다. 그리고 이 과정에서 사용된 버전은 오래되었습니다. 과정은 이후 새 버전에서 제거된 종속성 'camel-xmljson'을 사용하고 있었습니다.
프로젝트 업그레이드
그래서 사용할 프로젝트
Java 17
와 아파치 카멜 버전3.18.0
을 업그레이드하기로 했습니다.이렇게 하려면 프로젝트에서 새 종속성을 가져와야 했습니다.
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jaxb</artifactId>
<version>${camel-version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>${camel-version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jacksonxml</artifactId>
<version>${camel-version}</version>
</dependency>
코드 리팩터링
새 종속성을 가져온 후 코드를 리팩터링해야 했습니다.
리팩토링 전
코드는 다음과 같습니다.
public static void main(String[] args) throws Exception {
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file:pedidos?delay=5s&noop=true").
split().
xpath("/pedido/itens/item").
filter().
xpath("/item/formato[text()='EBOOK']").
marshal().xmljson().
log("${id} - ${body}").
setHeader(Exchange.FILE_NAME, simple("${file:name.noext}-${header.CamelSplitIndex}.json")).
to("file:saida");
}
});
context.start();
Thread.sleep(20000);
context.stop();
}
리팩토링 후
이제 다음 작업을 수행해야 했습니다.
public static void main(String[] args) throws Exception {
try (CamelContext context = new DefaultCamelContext()) {
JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setPrettyPrint(true);
jacksonDataFormat.enableFeature(SerializationFeature.WRAP_ROOT_VALUE);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file:input?delay=5s&noop=true")
.filter()
.xpath("/pedido/itens/item/formato[text()='EBOOK']")
.unmarshal().jacksonXml(Pedido.class)
.marshal(jacksonDataFormat)
.setHeader(Exchange.FILE_NAME, simple("${file:name.noext}.json"))
.to("file:output");
}
});
context.start();
Thread.sleep(20000);
context.stop();
}
}
"Pedido.java"에서 잭슨 주석을 사용해야 했습니다.
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "pedido")
public class Pedido {
@JacksonXmlProperty(localName = "id")
private String id;
@JacksonXmlProperty(localName = "dataCompra")
private String dataCompra;
@JacksonXmlProperty(localName = "itens")
private Itens itens;
@JacksonXmlProperty(localName = "pagamento")
private Pagamento pagamento;
....
// getters and setters
참고로 '리팩토링 전'은 'marshal().xmljson()'만 사용하면 되었고, '리팩토링 후'는 다음과 같이 해야 했습니다.
JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setPrettyPrint(true);
jacksonDataFormat.enableFeature(SerializationFeature.WRAP_ROOT_VALUE);
.unmarshal().jacksonXml(Pedido.class)
.marshal(jacksonDataFormat)
결론
글쎄, 이것이 내가 찾은 해결책이었습니다.
더 좋은 방법이 있을 텐데 아시는 분은 댓글 남겨주시면 개선하도록 도와드리겠습니다. :디
정말 감사합니다. 또 뵙겠습니다!
Reference
이 문제에 관하여(Apache camel: XML 파일을 JSON 파일로.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/andremoriya/apache-camel-xml-file-to-json-file-2m36텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)