当前位置:   article > 正文

运用JAXB实现xml实体的按需注入

jaxbcontext xml注入

使用场景:最近做一个项目,项目中请求和相应报文均是xml格式的,然后报文头都是一样的,只是body会不同,JAXB是一个很好的解决java对象和xml的工具,我们需要在不用的接口返回不同的body体,但是又不想代码冗余每一个都写一个JAXB配置,最好是搞一个通用的,于是下面的代码就产生了。

 

一、简介

1、概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,即是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。有多种实现。

2、JAXB中有什么:包含“xjc”工具和一个“schemagen”工具。 

“xjc”工具可以用来将XML模式或其他类型模式文件(Java 1.6试验性地支持RELAX NG,DTD以及WSDL)转换为Java类。Java类使用javax.xml.bind.annotation包下的Java 标注,例如@XmlRootElement和@XmlElement。XML列表序列表示为java.util.List类型的属性, 通过JAXBContext可以创建Marshallers(将Java对象转换成XML)和Unmarshallers(将XML解析为Java对象)。

另外的“schemagen”工具,能够执行“xjc”的反向操作,通过一组标注的Java类创建一个XML模式。

二、依赖

JDK5以下开发需要的jar包:activation.jar、jaxb-api.jar、 jaxb-impl.jar、 jsr173-api.jar;

如果是基于JDK6以上版本已经集成JAXB2的JAR,在目录{JDK_HOME}/jre/lib/rt.jar中。

三、应用

第一步:创建要转化的java对象,该对象需要使用相关注解注释各字段

(标注在get方法上,标注在别的地方运行时会报错)

  1. import javax.xml.bind.annotation.XmlElement;
  2. import javax.xml.bind.annotation.XmlElementWrapper;
  3. import javax.xml.bind.annotation.XmlElements;
  4. import javax.xml.bind.annotation.XmlRootElement;
  5. import java.io.Serializable;
  6. /**
  7. *
  8. * @author Zhaky
  9. */
  10. @XmlRootElement(name = "merchant")
  11. public class Merchant implements Serializable {
  12. private CommonHead head;
  13. private BaseBody body;
  14. @XmlElement(name = "head")
  15. public CommonHead getHead() {
  16. return head;
  17. }
  18. public Merchant() {
  19. super();
  20. }
  21. public void setHead(CommonHead head) {
  22. this.head = head;
  23. }
  24. @XmlElements({//重要:
  25. @XmlElement(name="body",type=Cancel.class),//这里的Cancel与下面类的@XmlType(name="Cancel")相对应,生成xml时节点名字为body
  26. @XmlElement(name="body",type=Refund.class),
  27. @XmlElement(name="body",type=Pay.class)
  28. })
  29. public BaseBody getBody() {
  30. return body;
  31. }
  32. public void setBody(BaseBody body) {
  33. this.body = body;
  34. }
  35. }

@XmlElements 重要说明:网上资料对这个参数介绍不多也不详细,简单来说就是通过这个参数实现按需加载实体

  1. import javax.xml.bind.annotation.XmlTransient;
  2. import java.io.Serializable;
  3. /**
  4. * Created by Zhaky
  5. */
  6. @XmlTransient
  7. public abstract class BaseBody implements Serializable {
  8. public BaseBody() {
  9. super();
  10. }
  11. }
  12. //此处必须要有无参数的构造方法

 

  1. import org.hibernate.validator.constraints.Length;
  2. import javax.validation.constraints.NotNull;
  3. import javax.xml.bind.annotation.XmlType;
  4. /**
  5. */
  6. @XmlType(name="Cancel")
  7. public class Cancel extends BaseBody {
  8. //这里参数校验和xml实体公用了一个pojo
  9. @NotNull(message = "{common.oriReqMsgId.not.empty}")
  10. @Length(min = 0, max = 32, message = "{common.oriReqMsgId.length.error}")
  11. private String oriReqMsgId;//原交易流水号
  12. //扩展字段
  13. @Length(min = 0, max = 128, message = "{common.extend1.length.error}")
  14. private String extend1;//备用
  15. @Length(min = 0, max = 128, message = "{common.extend2.length.error}")
  16. private String extend2;//备用
  17. @Length(min = 0, max = 128, message = "{common.extend3.length.error}")
  18. private String extend3;//备用·
  19. .....
  20. //省略get set方法
  21. }

 

配置完成开始使用!!

通用方法

  1. public class XMLParaUtil{
  2. public static String getRequestParamsXmlString(@Valid BaseBody requestVO) throws JAXBException {
  3. Merchant message = new Merchant();
  4. CommonHead head = new CommonHead();
  5. head.init(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"));
  6. message.setHead(head);
  7. message.setBody(requestVO);
  8. JAXBContext context = JAXBContext.newInstance(Merchant.class);
  9. Marshaller marshaller = context.createMarshaller();
  10. StringWriter sw = new StringWriter();
  11. marshaller.marshal(message, sw);
  12. return sw.toString();
  13. }
  14. }

 

外部使用时根据不同的场景引入不同的实现类即可

  1. Cancel requestVO =new Cancel();
  2. String plainXML = CmbcCore.getRequestParamsXmlString(requestVO);

 

转载于:https://my.oschina.net/zhaky/blog/852498

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/827680
推荐阅读
相关标签
  

闽ICP备14008679号