因为对接系统的XML所需映射的实体类有几十个,自己来处理不太现实,于是一直找寻找这样的工具,终于让我发现了jaxb2-maven-plugin:

  http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/

  一键生成,使用也比较方便,但是需要在maven环境下,下面将介绍如果使用

  在maven工程下的pom.xml导入:

             <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<id>id1</id>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<!-- XSD源文件 -->
<sources>
<source>src/main/xsd</source>
</sources>
<!-- 源码输出目录 -->
<outputDirectory>target/generated-sources/jaxb</outputDirectory>
<!-- 指定文件生产 -->
<!--<schemaFiles>client_centric_data.xsd</schemaFiles>-->
<packageName>com.zgz.adsr</packageName>
</configuration>
</execution>
</executions>
<!--<configuration>-->
<!--&lt;!&ndash; The package of your generated sources &ndash;&gt;-->
<!--<packageName>com.zgz</packageName>-->
<!--</configuration>-->
</plugin>

  然后,在工程中是用mvn clean install就会生成源码了。

  

  如果有多个XSD文件,可以不指定packageName,会自动分类,如果指定了,就所有实体类都在一起了,挺不方便的。可能是不清楚怎么设置,有清楚怎么设置的,麻烦评论让我学习一下。

  下面说说,映射父节点的东东,因为请求的XML父节点要设置前缀以及各种东东的,例如下图:

  

  可在生成的package-info.java文件中添加注解:

@javax.xml.bind.annotation.XmlSchema(
     // 注意这里,下面的XmlNs匹配了,就显示ie前缀
namespace = "http://www.shkf.com/rootelement",
//子节点的设置
//elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
xmlns={ @XmlNs(prefix="ie", namespaceURI="http://www.xxx.com/rootelement"),
@XmlNs(prefix="ie1", namespaceURI="http://www.xxx.com/subaccount"),
@XmlNs(prefix="ie2", namespaceURI="http://www.xxx.com/ccd"),
@XmlNs(prefix="simple", namespaceURI="http://www.xxx.com/simple"),
@XmlNs(prefix="tcl", namespaceURI="http://www.xxx.com/tcl"),
@XmlNs(prefix="xsi", namespaceURI="http://www.w3.org/2001/XMLSchema-instance")}
)

  但是schemaLocation的设置就在请求实体转换为XML的时候做设置:

  marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.xxx.com/rootelement root_elements.xsd ");

  或者在父节点实体类加个属性值:

  @XmlAttribute(name ="xsi:schemaLocation")

  public String schemaLocation="http://www.xxx.com/rootelement root_elements.xsd ";

  还有一种方式设置前缀,继承NamespacePrefixMapper,但跟着上面的属性设置,好像会有点问题,具体还没怎么研究。

  使用这方式需要引用依赖,不然会报错。

        <dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.4-1</version>
</dependency>

  如要去掉standalone,可参考:

  https://stackoverflow.com/questions/14152523/remove-standalone-yes-from-jaxb-generated-xml

  https://blog.csdn.net/weixin_39964562/article/details/79072277

import java.io.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.stream.*; @XmlRootElement
public class Login { private JAXBContext jaxbContext;
private XMLOutputFactory xmlOutputFactory; public Login() {
try {
jaxbContext = JAXBContext.newInstance(Login.class);
xmlOutputFactory = XMLOutputFactory.newFactory();
} catch(Exception e) {
e.printStackTrace();
} } public static void main(String[] args) {
Login demo = new Login();
System.out.println(demo.getMessage());
} public final String getMessage() {
try {
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty("jaxb.encoding", "ISO-8859-1");
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(baos, (String) jaxbMarshaller.getProperty(Marshaller.JAXB_ENCODING));
xmlStreamWriter.writeStartDocument((String) jaxbMarshaller.getProperty(Marshaller.JAXB_ENCODING), "1.0");
jaxbMarshaller.marshal(this, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
xmlStreamWriter.close();
return new String(baos.toByteArray());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }

  JaxbUtil类:

package xxxx.util;

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
//import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;
import org.apache.commons.lang.StringUtils;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException; import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter; /**
* @author GuangZe
* @version v1.0
* @project: vedio
* @description: 这里描述类的用处
* @copyright: 2020
* @company:
* @date 2020/12/16 15:00
*/
public class JaxbUtil { public static String validate(String xml, String xsdPath) {
String errMsg = null;
String[] xmlArr;
int lineNum;
try {
Source root = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/root_elements.xsd")); Source code = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/code_lists.xsd")); Source simple = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/simple_types.xsd")); Source ccd = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/client_centric_data.xsd")); Source customer = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/customer_account.xsd")); Source sub = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/sub_account.xsd")); Source trade = new StreamSource(JaxbUtil.class.getClassLoader()
.getResourceAsStream("xsd/trading_account.xsd")); Source[] sourceArr = {code, simple, ccd, customer, sub, trade, root}; Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sourceArr);
Validator validator = schema.newValidator();
Source s = new StreamSource(new StringReader(xml));
validator.validate(s);
}catch (SAXParseException e){
e.printStackTrace();
xmlArr = xml.split("\n");
lineNum = e.getLineNumber();
errMsg = e.getMessage();
if(lineNum<=xmlArr.length && StringUtils.isNotBlank(xmlArr[lineNum-1])){
errMsg +="["+xmlArr[lineNum-1].trim()+"]";
}
System.out.println(errMsg);
} catch (SAXException e1) {
e1.printStackTrace();
errMsg = e1.getMessage();
System.out.println(errMsg);
} catch (IOException e2) {
e2.printStackTrace();
errMsg = e2.getMessage();
System.out.println(errMsg);
}
return errMsg;
} /**
* 序列化
* @param object
* @throws JAXBException
*/
public static String marshall(Object object) throws JAXBException {
// 通过映射的类创建XMLContext上下文对象,其中参数为映射的类。
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
// 通过JAXBComtext上下文对象的createMarshaller()方法,创建一个对象java格式转化成XML的格式
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
//自定义前缀
// NamespacePrefixMapper mapper = new PreferredMapper();
// marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.xxx.com/rootelement root_elements.xsd ");
// 最后,将JAVA对象转换到制定的输出位置,其中的object为java对象。
StringWriter writer = new StringWriter();
marshaller.marshal(object, writer);
return writer.toString();
} /**
* 解析
* @param clazz
* @param xml
* @return
* @throws Exception
*/
public static Object unmarshaller(Class<?> clazz, String xml) throws Exception {
if (StringUtils.isEmpty(xml)) {
return null;
}
// 通过映射的类创建XMLComtext上下文对象,其中参数为映射的类。
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
// 通过JAXBContext上下文对象创建createUnmarshaller()方法,创建XML转换成JAVA对象的格式。
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// 最后,将XML转换成对映的类,转换后需要强制性转换成映射的类
StringReader stringReader = new StringReader(xml);
Object object = unmarshaller.unmarshal(stringReader);
return object;
} public static class PreferredMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri,
String suggestion, boolean requirePrefix) {
if ("http://www.xxx.com/rootelement".equals(namespaceUri)) {
return "ie";
}
return suggestion;
} } }

根据XML生成实体类的更多相关文章

  1. NHibernate生成实体类、xml映射文件

    最近工作电脑装完win10后,之前使用的codeSmith安装不了,索性自己写一个. 界面比较简单,如下图: 第一行为Oracle数据库的连接字符串.连接成功后,填充表到第4行的下拉列表中. 第二行为 ...

  2. 如何由XSD自动生成XML和实体类

    项目中有时候要用XML作为数据源,因此需要定义XML文件和相应的类,最佳方法是首先定义XSD,然后自动生成实体类,最后生成XML和填充数据:读取XML数据源的时候,首先用XSD验证XML数据格式,然后 ...

  3. 利用MyEclipse连接数据库并自动生成基于注解或者XML的实体类

    一.利用MyEclipse连接数据库 1. 打开MyEclipse的数据库连接视图 然后在Other中找到"MyEclipse Database"中的DB Browser 2. 在 ...

  4. mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. c# XML和实体类之间相互转换(序列化和反序列化)[砖]

    link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlU ...

  6. C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  7. MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

    前文: hibernate带给我们的O/RMapping思想是很正确的,即从面相对象的角度来设计工程中的实体对象,建立pojo,然后在编写hbm.xml映射文件来生成数据表.但是在实际开发中,往往我们 ...

  8. T4模板根据DB生成实体类

    1.前言 为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要是能写出一个T4模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多好,心动不如行动.记得使用T4 ...

  9. 使用T4为数据库自动生成实体类

    T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器.使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML ...

  10. T4模板_根据DB生成实体类

    为了减少重复劳动,可以通过T4读取数据库表结构,生成实体类,用下面的实例测试了一下 1.首先创建一个项目,并添加文本模板: 2.添加 文本模板: 3.向T4文本模板文件添加代码: <#@ tem ...

随机推荐

  1. Python安装第三库超时的解决方法

    Python安装第三库超时的解决方法 1. 在很多时候使用python的时候需要使用到某些第三方库,比较常规的方法是使用cmd命令使用在线安装的方法(前提是在安装好了python相应版本时候配置好了相 ...

  2. Django中遇到的问题

    1.如右上角无Dj的 Django标识 解决方法1: 关闭Pycharm 重启创建项目,进入到Django的所在目录下 解决方法2: 方法3: 第一步: 第二步: 第三步: 第四步: 2.如下图:显示 ...

  3. Vue CLI 2内置框架webpack框架结构解析

    目前Vue已经到3.X版本,相应的Vue CLI也已经是Vue CLI 3版本,创建命令使用vue create,如果要用2.X版的vue init命令,需要全局安装一个桥接工具: npm insta ...

  4. Dilworth

    Dilworth 定理 偏序集能划分成的最少的全序集个数等于最大反链的大小. 名词解释 偏序 在集合 \(S\) 中定义的二元关系 \(\le\),如果它满足以下三个性质: 自反性:\(\forall ...

  5. 面试题 --MySQL索引

    InnoDB引擎与MyISAM引擎的区别 ? InnoDB支持事务,MyISAM不支持事务 InnoDB支持行级锁,表级锁,MyISAM只支持表级锁 InnoDB支持外键,MyISAM不支支持外键 I ...

  6. 【Java】Object

    Object转Map import com.alibaba.fastjson.JSON; import com.runsky.utils.JsonUtils; String objectToJson ...

  7. Xrdp服务安装配置实现Linux远程桌面访问以及问题处理

    0x00 基础介绍 0x01 安装桌面环境 Ubuntu 系列 0x02 Xrdp 安装使用 How to Install xrdp on Ubuntu ? How to Install xrdp t ...

  8. Web安全与渗透测试笔记

    Web安全与渗透测试笔记 @author: lamaper 一.基本网络知识 (一)网络是怎样联通的 TCP/IP协议 Internet Http协议 (二)Http协议 http请求 一个完整的Ht ...

  9. sudo:Operation not permitted事件

    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14933949.html 前言 事情是这样的,在风和日丽的一天,我如往常一样在服务器上敲下了sudo xxx ...

  10. docker+gunicorn+fastapi部署

    一.准备工作 1.先确保项目可以正常运行 2.使用pip freeze导出第三方库 3.在项目根目录新建pip.conf文件,写入一下内容 [global] index-url=http://pypi ...