如果不同的节点出现在之间,则XML编组不起作用

发布于 2025-01-20 11:51:54 字数 5309 浏览 2 评论 0原文

我有下面的 ejb-jar.xml 我试图将其映射到 POJO。它只映射一个 MDB 和一个 Session bean,尽管 xml 有很多。

ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="2.1"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"> 
    <display-name>TradeEJBs</display-name>
    <enterprise-beans>
        <session>
            <description>Trade Session EJB manages all Trading services</description>
            <display-name>TradeEJB</display-name>
            <ejb-name>TradeEJB</ejb-name>
            <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
            <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <session>
            <description>Trade JDBC Session EJB manages all Trading services</description>
            <display-name>TradeJDBC</display-name>
            <ejb-name>TradeJDBC</ejb-name>
            <home>org.apache.geronimo.samples.daytrader.session.TradeJDBCHome</home>
            <remote>org.apache.geronimo.samples.daytrader.session.TradeJDBC</remote>
            <ejb-class>org.apache.geronimo.samples.daytrader.session.TradeJDBCBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <message-driven>
            <ejb-name>TradeStreamerMDB</ejb-name>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeStreamerMDB</ejb-class>
            <messaging-type>javax.jms.MessageListener</messaging-type>
            <transaction-type>Container</transaction-type>
            <message-destination-type>javax.jms.Topic</message-destination-type>
            <message-destination-link>TradeStreamerTopic</message-destination-link>
            </message-driven>
        <session>
            <display-name>KeySequenceEJB</display-name>
            <ejb-name>KeySequenceEJB</ejb-name>
            <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequenceHome</local-home>
            <local>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequence</local>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.KeySequenceBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <message-driven>
            <display-name>TradeBrokerMDB</display-name>
            <ejb-name>TradeBrokerMDB</ejb-name>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeBrokerMDB</ejb-class>
            <messaging-type>javax.jms.MessageListener</messaging-type>
            <transaction-type>Container</transaction-type>
            <message-destination-type>javax.jms.Queue</message-destination-type>
            <message-destination-link>TradeBrokerQueue</message-destination-link>
        </message-driven>
    </enterprise-beans>
</ejb-jar>

测试器类:

(EjbJarType、MDBModule、SessionModule POJO 已就位并带有正确的 Xml 注释)

public class XmlMarshallingTester {

public static void main(String[] args) throws Exception {
    
    String configFilePath = "C:\\SampleProject\\ejb\\src\\main\\resources\\META-INF\\ejb-jar.xml";
    EjbJarType ejbJarBean = (EjbJarType) marshal(configFilePath.toString(), EjbJarType.class);
    Map<String, MDBModule> mdbModeulMap = EJBXMLBeanUtil.getMdbDetails(ejbJarBean);
    Map<String, SessionModule> sessionMap = EJBXMLBeanUtil.getSessionBeanData(ejbJarBean);
}


public static Object marshal(String filePath, Class<?> targetClass) throws JsonParseException, JsonMappingException,
IOException, InstantiationException, IllegalAccessException {
    FileInputStream fi = new FileInputStream(filePath);

    JacksonXmlModule module = new JacksonXmlModule();
    module.setDefaultUseWrapper(false);
    XmlMapper xmlMapper = new XmlMapper(module);

    Object obj = targetClass.newInstance();
    Object beans = xmlMapper.readValue(fi, obj.getClass());
    return beans;

}

}

但是,如果 xml文件包含按顺序分组的所有相同类型的节点(如下所示),它按预期映射所有 MDB 和会话 bean。

<enterprise-beans>
    <session>
       <!-- some data -->
    </session>
    <session>
       <!-- some data -->
    </session>
    <session>
        <!-- some data -->
    </session>
    <message-driven>
        <!-- some data -->
    </message-driven>
    <message-driven>
        <!-- some data -->
    </message-driven>
</enterprise-beans>

那么,我们是否可以遵循任何机制/方式按原样读取所有 XML 节点并映射到 POJO?指点表示赞赏!

I have below ejb-jar.xml which I am trying to map to POJO. It just maps only one MDB and one Session bean though xml has many.

ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="2.1"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"> 
    <display-name>TradeEJBs</display-name>
    <enterprise-beans>
        <session>
            <description>Trade Session EJB manages all Trading services</description>
            <display-name>TradeEJB</display-name>
            <ejb-name>TradeEJB</ejb-name>
            <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
            <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <session>
            <description>Trade JDBC Session EJB manages all Trading services</description>
            <display-name>TradeJDBC</display-name>
            <ejb-name>TradeJDBC</ejb-name>
            <home>org.apache.geronimo.samples.daytrader.session.TradeJDBCHome</home>
            <remote>org.apache.geronimo.samples.daytrader.session.TradeJDBC</remote>
            <ejb-class>org.apache.geronimo.samples.daytrader.session.TradeJDBCBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <message-driven>
            <ejb-name>TradeStreamerMDB</ejb-name>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeStreamerMDB</ejb-class>
            <messaging-type>javax.jms.MessageListener</messaging-type>
            <transaction-type>Container</transaction-type>
            <message-destination-type>javax.jms.Topic</message-destination-type>
            <message-destination-link>TradeStreamerTopic</message-destination-link>
            </message-driven>
        <session>
            <display-name>KeySequenceEJB</display-name>
            <ejb-name>KeySequenceEJB</ejb-name>
            <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequenceHome</local-home>
            <local>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequence</local>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.KeySequenceBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <message-driven>
            <display-name>TradeBrokerMDB</display-name>
            <ejb-name>TradeBrokerMDB</ejb-name>
            <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeBrokerMDB</ejb-class>
            <messaging-type>javax.jms.MessageListener</messaging-type>
            <transaction-type>Container</transaction-type>
            <message-destination-type>javax.jms.Queue</message-destination-type>
            <message-destination-link>TradeBrokerQueue</message-destination-link>
        </message-driven>
    </enterprise-beans>
</ejb-jar>

Tester Class:

(EjbJarType, MDBModule,SessionModule POJOs are in place with proper Xml annotations)

public class XmlMarshallingTester {

public static void main(String[] args) throws Exception {
    
    String configFilePath = "C:\\SampleProject\\ejb\\src\\main\\resources\\META-INF\\ejb-jar.xml";
    EjbJarType ejbJarBean = (EjbJarType) marshal(configFilePath.toString(), EjbJarType.class);
    Map<String, MDBModule> mdbModeulMap = EJBXMLBeanUtil.getMdbDetails(ejbJarBean);
    Map<String, SessionModule> sessionMap = EJBXMLBeanUtil.getSessionBeanData(ejbJarBean);
}


public static Object marshal(String filePath, Class<?> targetClass) throws JsonParseException, JsonMappingException,
IOException, InstantiationException, IllegalAccessException {
    FileInputStream fi = new FileInputStream(filePath);

    JacksonXmlModule module = new JacksonXmlModule();
    module.setDefaultUseWrapper(false);
    XmlMapper xmlMapper = new XmlMapper(module);

    Object obj = targetClass.newInstance();
    Object beans = xmlMapper.readValue(fi, obj.getClass());
    return beans;

}

}

However, if the xml file contains all the same type of nodes grouped sequentially (as below), it maps all the MDBs and Session beans as expected.

<enterprise-beans>
    <session>
       <!-- some data -->
    </session>
    <session>
       <!-- some data -->
    </session>
    <session>
        <!-- some data -->
    </session>
    <message-driven>
        <!-- some data -->
    </message-driven>
    <message-driven>
        <!-- some data -->
    </message-driven>
</enterprise-beans>

So, is there any mechanism/way we can follow for reading all the XML nodes in the order as is and mapping to POJO? Pointers appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文