概述
使用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动态验证对象值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复