首页 > 解决方案 > 使用 XStreamMarshaller 的多个 setImplicitCollections

问题描述

我正在尝试 XStreamMarshaller。但是当我尝试解析两个 xsd:complexType 的 xml 文件时,我收到了这个错误:

class[1]            : com.mc.batch.mapping.authorization.PIECES_JOINTES
converter-type[1]   : com.thoughtworks.xstream.converters.reflection.ReflectionConverter

xml:

<DOCUMENT>

    <ARTICLES>
        <ARTICLE>
            <NUMERO_ARTICLE>1</NUMERO_ARTICLE>
        </ARTICLE>
        <ARTICLE>
            <NUMERO_ARTICLE>2</NUMERO_ARTICLE>
        </ARTICLE>
    </ARTICLES>

    <PIECES_JOINTES>
        <PIECES_JOINTE>
            <TYPE_DOCUMENT>PDF</TYPE_DOCUMENT>
        </PIECES_JOINTE>
        <PIECES_JOINTE>
            <TYPE_DOCUMENT>WORD</TYPE_DOCUMENT>
        </PIECES_JOINTE>
        <PIECES_JOINTE>
            <TYPE_DOCUMENT>XLS</TYPE_DOCUMENT>
        </PIECES_JOINTE>
    </PIECES_JOINTES>

</DOCUMENT>

代码 :

@Bean
MessageConverter messageConverter() {

    Map<String, Class<?>> aliases = new HashMap<>();

    XStreamMarshaller marshallerAuthorization = new XStreamMarshaller();
    aliases.put("DOCUMENT", DOCUMENT.class);
    marshallerAuthorization.setAliases(aliases);

    Map implicitArticle = Collections.singletonMap(ARTICLES.class, "ARTICLE");
    Map implicitPiece   = Collections.singletonMap(PIECES_JOINTES.class, "PIECES_JOINTE");

    marshallerAuthorization.setImplicitCollections(implicitPiece);
    marshallerAuthorization.setImplicitCollections(implicitArticle);

    MarshallingMessageConverter messageConverterAuthorization = new MarshallingMessageConverter(marshallerAuthorization);
    messageConverterAuthorization.setTargetType(MessageType.TEXT);
    return messageConverterAuthorization;
}

但是如何使用两个setImplicitCollections进行映射PIECES_JOINTES.classARTICLES.class

我该如何解决这个冲突?欢迎任何帮助。提前致谢。

标签: springspring-integrationspring-batchxstream

解决方案


如何使用两个 setImplicitCollections 映射 PIECES_JOINTES.class 和 ARTICLES.class

您不需要调用setImplicitCollections两次,第二次调用中传递的值将覆盖第一次调用。此方法接受地图,因此您可以编写如下内容:

Map<Class<?>, String> implicitCollections = new HashMap<>();
implicitCollections.put(ARTICLES.class, "ARTICLE");
implicitCollections.put(PIECES_JOINTES.class, "PIECES_JOINTE");

marshallerAuthorization.setImplicitCollections(implicitCollections);

代替:

Map implicitArticle = Collections.singletonMap(ARTICLES.class, "ARTICLE");
Map implicitPiece   = Collections.singletonMap(PIECES_JOINTES.class, "PIECES_JOINTE");

marshallerAuthorization.setImplicitCollections(implicitPiece);
marshallerAuthorization.setImplicitCollections(implicitArticle);

推荐阅读