我是靠谱客的博主 爱笑信封,最近开发中收集的这篇文章主要介绍使用xsd文件对对象的值进行动态验证xsd动态验证对象值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用xsd文件对对象的值进行动态验证

xsd动态验证对象值

以前做了一个项目,挺有意思的,业务需求经常变动。业务方提出要求,希望我们对保存的对象的值,在不改动代码的情况下,能通过配置验证的条件。思索一下,那不就是通过配置文件来进行控制吗?不就像我们编写mybaitis、spring文件一样,可以通过xsd来控制我们输入。

干就完了

1、先定义一个值对象

@XmlRootElement(name = "B2CReq")  **//对应test.xsd的 <xs:element name="B2CReq">**
public class B2CReq {
    @XmlElement
    public String merId; **//对应test.xsd的 <xs:element name="merId">**
    @XmlElement
    public String orderNo;**//对应test.xsd的 <xs:element name="orderNo">**
    @XmlElement
    public String orderAmt;**//对应test.xsd的 <xs:element name="orderAmt">**

    @XmlTransient
    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    @XmlTransient
    public String getOrderAmt() {
        return orderAmt;
    }

    public void setOrderAmt(String orderAmt) {
        this.orderAmt = orderAmt;
    }

    @XmlTransient
    public String getMerId() {
        return merId;
    }

    public void setMerId(String merId) {
        this.merId = merId;
    }
}

2、编写一个xsd文件test.xsd,用于控制验证

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
<xs:element name="B2CReq">
    <xs:complexType>
      <xs:all>
		<xs:element name="merId">
			<xs:simpleType>
			  <xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="20"/>
			  </xs:restriction>
			</xs:simpleType>
		</xs:element>
 
		<xs:element name="orderNo">
			<xs:simpleType>
			  <xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="30"/>
			  </xs:restriction>
			</xs:simpleType>
		</xs:element>
 
		<xs:element name="orderAmt">
			<xs:simpleType>
			  <xs:restriction base="xs:decimal">
				<xs:pattern value="[d]{0,16}.[d]{2}"/>
			  </xs:restriction>
			</xs:simpleType>
		</xs:element>

      </xs:all>
    </xs:complexType>
</xs:element>
 
</xs:schema>

3、一个类,用于读取xsd配置,来验证输入的对象值验证

public class XmlUtils {
    private static XmlUtils instance = null;
    public static XmlUtils getInstance(){
        if(instance==null){
            instance = new XmlUtils();
        }
        return instance;
    }

    public <T> String objToXml(T t) throws Exception{
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_ENCODING,"utf-8");
        StringWriter sw = new StringWriter();
        m.marshal(t,sw);
        return sw.toString();
    }

    public <T> boolean validate(T t, String schemaFile) throws Exception{
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        Schema schema = factory.newSchema(new File(schemaFile));
        Marshaller m = context.createMarshaller();
        m.setSchema(schema);
        m.marshal(t, new DefaultHandler());
        return true;
    }
}

4、测试

    public static void main(String[] args) {
        B2CReq bq = new B2CReq();
        bq.setMerId("s");
        bq.setOrderNo("s");
        bq.setOrderAmt("1.00");
        try {
           boolean s = XmlUtils.getInstance().validate(bq, "/test.xsd");
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

测试一结果为:true

    public static void main(String[] args) {
        B2CReq bq = new B2CReq();
        bq.setMerId("s");
        bq.setOrderNo("s");
        bq.setOrderAmt("1.011");
        try {
           boolean s = XmlUtils.getInstance().validate(bq, "/test.xsd");
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

测试二结果为:抛出如下异常,表示1.011超过了小数点后面2位,所以不符合。
javax.xml.bind.MarshalException

  • with linked exception:
    [org.xml.sax.SAXParseException; lineNumber: 0; columnNumber: 0; cvc-pattern-valid: 对于类型为 ‘#AnonType_orderAmtB2CReq’ 的模式 ‘[d]{0,16}.[d]{2}’, 值 ‘1.011’ 不具有面有效性。]
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:123)
    at com.freespace.xmlxsdvalidate.XmlUtils.validate(XmlUtils.java:39)

大家感兴趣可以多谢几个测试用例进行测试。。。

最后

以上就是爱笑信封为你收集整理的使用xsd文件对对象的值进行动态验证xsd动态验证对象值的全部内容,希望文章能够帮你解决使用xsd文件对对象的值进行动态验证xsd动态验证对象值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部