如果不同的节点出现在之间,则XML编组不起作用
我有下面的 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论