Apache camel: XML 파일을 JSON 파일로.

4573 단어
안녕하세요,

나는 며칠 전에 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)


결론



글쎄, 이것이 내가 찾은 해결책이었습니다.

더 좋은 방법이 있을 텐데 아시는 분은 댓글 남겨주시면 개선하도록 도와드리겠습니다. :디

정말 감사합니다. 또 뵙겠습니다!

좋은 웹페이지 즐겨찾기