日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

XSD到Java:用XJC代碼生成器高效解析XML Schema實戰(zhàn)指南

XSD到Java:用XJC代碼生成器高效解析XML Schema實戰(zhàn)指南 前陣子對接一個外部供應(yīng)商接口對方丟了個 XSD-7 數(shù)據(jù)契約文檔過來沒有現(xiàn)成的 SDK只給了一份 XML Schema 規(guī)范和樣例報文。當(dāng)時項目時間很緊報文結(jié)構(gòu)特別復(fù)雜嵌套十幾個層級還有一堆枚舉、擴(kuò)展類型和 choice 分支。如果按老套路手寫 Java 映射類光對字段就得耗掉小一周而且容易出現(xiàn)類型對不上、枚舉漏掉值這種低級錯誤。后來直接上了 XJC 代碼生成器JAXB 編譯器把 XSD-7 文檔喂進(jìn)去一套 Java Bean 全部自動生成幾分鐘就把這個硬骨頭啃下來了。如果你也是做 Java 服務(wù)端對接、處理 XML 報文、或者被各種 XSD 文檔折磨過的開發(fā)者這篇文章應(yīng)該能幫你少走不少彎路。我會把 XSD 如何映射成 Java 類的底層邏輯、XJC 命令行的完整使用姿勢、以及我實戰(zhàn)中踩過的坑和對應(yīng)的外部綁定文件寫法都整理出來算是一份可以直接拿去用的實操筆記。這篇文章基于我自己在實際項目里使用 XJC 的經(jīng)驗結(jié)合一份名為 XSD-7 的 XML Schema 契約文檔逐步展開。所有示例均為虛構(gòu)數(shù)據(jù)但處理思路和命令用法都是實打?qū)嵉摹?. XSD-7 這份數(shù)據(jù)契約到底在描述什么先別急著敲命令我建議任何人拿到 XSD 文件的第一件事都不是生成代碼而是先把這份 Schema 從頭到尾讀一遍。以 XSD-7 為例這其實是一份交易報文級的 XML Schema 文檔定義了多個全局元素和復(fù)雜類型。XML SchemaXSD本身就是用來描述 XML 文檔結(jié)構(gòu)的“合同”它會告訴你哪些元素存在、元素之間的嵌套關(guān)系、數(shù)據(jù)類型、取值范圍、是否必填、出現(xiàn)次數(shù)等等。XJC 所做的就是把這份“合同”用 Java 語言重新表達(dá)一遍生成一套對應(yīng)的 Java 類核心就是把 XML 世界里的復(fù)雜類型映射成 Java 里的類把元素和屬性映射成字段把簡單類型映射成 String、Integer 之類的 Java 類型然后通過 JAXB 注解把這些映射關(guān)系記錄下來。1.1 讀懂 XSD-7 里最常見的三種類型聲明XSD-7 這種文檔大量出現(xiàn)的無非是這幾種聲明xs:element、xs:complexType、xs:simpleType。xs:element就是定義某個 XML 元素的名稱和類型xs:complexType代表一個結(jié)構(gòu)體內(nèi)部可以有子元素或?qū)傩詘s:simpleType則是一個約束了取值范圍的簡單類型通常配合xs:restriction使用比如限制成一個枚舉。比如 XSD-7 里經(jīng)常能看到類似下面這種片段xs:complexType nameOrderInfo xs:sequence xs:element nameorderId typexs:string/ xs:element nameamount typexs:decimal/ xs:element namecurrency typeCurrencyCode/ /xs:sequence xs:attribute nameversion typexs:string userequired/ /xs:complexType這個OrderInfo復(fù)雜類型翻譯成人話就是一個訂單信息結(jié)構(gòu)體里面依次有訂單號字符串、金額小數(shù)、幣種枚舉并且掛著 一個必填的 version 屬性。XJC 拿到這段定義之后會生成一個名為OrderInfo的 Java 類類里有orderId、amount、currency三個字段以及一個version屬性字段全部用XmlElement、XmlAttribute注解標(biāo)注清楚。1.2 別忽略 targetNamespace 和 import/includeXSD-7 這種正式契約文檔幾乎一定會有targetNamespace這決定了生成 Java 類的包名級 XML 命名空間映射。比如聲明了targetNamespacehttp://example.com/trade/order默認(rèn)情況下 XJC 會根據(jù)這個命名空間生成一個包名。還有xs:include和xs:import這種跨文件引用——XSD-7 很可能是由主文件加若干子 Schema 組成的主文件 include 了其他文件里的公共類型。處理這種多文件結(jié)構(gòu)時不要用單個 xjc 命令去裸編譯而是要把整個文件集合放在同一個目錄、直接用主文件作為入口參數(shù)否則會出現(xiàn)找不到類型的報錯。拿到一份 XSD先花 20 分鐘把頂層設(shè)計、命名空間、include 關(guān)系理清楚這比上來就跑命令省事得多。因為 XJC 報錯的很多問題本質(zhì)上都是文檔結(jié)構(gòu)沒理清導(dǎo)致的。2. 從 XSD 到 Java 的映射算法XJC 編譯器的底層工作邏輯很多人用過 XJC但它內(nèi)部到底按什么規(guī)則把 XSD 轉(zhuǎn)換成 Java其實說不清楚。這塊搞明白了后面很多坑你都能提前避開因為幾乎所有的“為什么生成出來是這樣的類”都能在這個映射邏輯里找到答案。2.1 復(fù)雜類型和元素類與字段的對應(yīng)規(guī)則在 XJC 的世界里一個xs:complexType大多數(shù)情況下會被映射成一個 Java 類。這里的“大多數(shù)情況”是有講究的如果這個復(fù)雜類型是有name的那么直接生成一個以該名字命名的類如果它是嵌在某個xs:element內(nèi)部、沒有顯式名字的匿名復(fù)雜類型XJC 會依據(jù)元素名派生出一個類名。比如xs:element namecustomerxs:complexType...XJC 通常會生成一個叫Customer的類。復(fù)雜類型內(nèi)部的xs:sequence、xs:all、xs:choice里的每個子元素都會變成類里的一個字段。xs:sequence是順序敏感的子元素序列映射成 Java 字段時按 Schema 里聲明順序排好xs:all是一組無序但每個出現(xiàn)一次的子元素映射成一個普通字段集合xs:choice是幾個分支中只能出現(xiàn)其中一個XJC 會生成一個帶XmlElements注解的字段列表Java 類型是ListObject或者泛型化的JAXBElement?。minOccurs和maxOccurs也直接決定字段類型——maxOccursunbounded或大于 1 時字段是 ListminOccurs0時會生成XmlElement(required false)并允許空值。2.2 簡單類型枚舉、約束和 Java 基礎(chǔ)類型的映射xs:simpleType配合xs:restriction是 XSD-7 里最常見的數(shù)據(jù)校驗手段也是最容易被忽視的部分。比如xs:simpleType nameCurrencyCode xs:restriction basexs:string xs:enumeration valueCNY/ xs:enumeration valueUSD/ xs:enumeration valueEUR/ /xs:restriction /xs:simpleTypeXJC 默認(rèn)會把這種類型生成成一個 Java 枚舉類CurrencyCode枚舉常量就是 CNY、USD、EUR。這里有一個關(guān)鍵點默認(rèn)生成的枚舉值名稱來自 XSD 里的value屬性如果value里有空格、連字符或者數(shù)字開頭比如USD-1、EUR(2024)XJC 會做一次名稱清理但往往不太好看而且可能會有兩個不同取值被轉(zhuǎn)成同一個合法的 Java 標(biāo)識符直接導(dǎo)致編譯失敗。對于普通的xs:restriction比如限制長度、限制正則但沒有 enumerationXJC 不會生成特殊類型而是把它映射為基于base類型的 Java 基礎(chǔ)類型。簡單類型映射規(guī)則我用表格總結(jié)一下XSD 類型Java 類型默認(rèn)備注xs:stringString最常見無歧義xs:integerjava.math.BigInteger注意不是 int/longxs:intint受限于 32 位整數(shù)xs:longlong64 位xs:decimaljava.math.BigDecimal金額類必用xs:booleanboolean默認(rèn) false容器對象時用 Booleanxs:dateTimejavax.xml.datatype.XMLGregorianCalendar默認(rèn)映射后文詳談xs:datejavax.xml.datatype.XMLGregorianCalendar默認(rèn)映射不適合直接序列化xs:base64Binarybyte[]字節(jié)數(shù)組xs:anyTypeObject最泛用的類型xs:integer默認(rèn)映射成 BigInteger 是很多人第一次用會驚訝的地方因為這在 Java 里有點重但為了兼容 XML 里的任意整數(shù)精度JAXB 把它設(shè)計成 BigInteger。如果你確信業(yè)務(wù)上精度夠用可以在 binding 文件里做定制后面會專門寫。2.3 namespace 與包名生成的默認(rèn)策略XSD-7 文檔里的targetNamespace是包名生成的核心依據(jù)。比如http://example.com/trade/order這種 URIXJC 會根據(jù)逆域名規(guī)則生成包名通常是com.example.trade.order之類。但如果你的命名空間寫得不規(guī)范比如帶上了版本號http://example.com/order/v1生成的包名就會包含v1再比如命名空間里包含不是標(biāo)準(zhǔn)域名的局部生成結(jié)果可能是一長串下劃線橫線的奇怪包名。XJC 官方設(shè)計是把 URI 拆解并反轉(zhuǎn)但結(jié)果往往不符合 Java 包命名直覺。所以我的建議是除非迫不得已生成代碼時永遠(yuǎn)用-p參數(shù)顯式指定目標(biāo)包名不要讓 XJC 從命名空間推導(dǎo)。這樣能完全避免包名失控的問題。比如xjc -p dev.example.xsd7.model xsd-7.xsd這個-p參數(shù)就是用來覆蓋自動包名推導(dǎo)的。我每次對接外部 Schema 都會把它設(shè)成項目內(nèi)獨(dú)立的 model 包方便后期整體管理。3. 命令行生成實戰(zhàn)把 XSD-7 編譯成 Java 類的完整操作前面的理論部分搞明白之后進(jìn)入實操環(huán)節(jié)。XJC 這個命令說簡單也簡單就是一個命令行工具說復(fù)雜也復(fù)雜因為它有很多參數(shù)和隱藏行為。我以一份本地的 xsd-7.xsd 主文件為例展示我從拿到文件到生成代碼落地的全過程。3.1 環(huán)境準(zhǔn)備JDK 版本和 JAXB 依賴的取舍先看一個大前提JDK 8 自帶了 JAXB 和 XJC直接在命令行敲xjc就能用編出來的代碼也是基于javax.xml.bind注解的。但是如果你用的是 JDK 11 或更高版本Oracle 已經(jīng)從標(biāo)準(zhǔn) JDK 里移除了 JAXB 模塊命令行里沒有現(xiàn)成的 xjc 可用得單獨(dú)引入依賴或者下載插件。JDK 17 以后尤其明顯。我們項目里用的是 JDK 17所以我處理 XSD-7 時直接在 Maven 里集成了org.jvnet.jaxb2:maven-jaxb2-plugin插件這個插件會在構(gòu)建階段自動調(diào)用 XJC 生成代碼不需要單獨(dú)裝工具。如果你只是想快速生成一次代碼看看效果也可以下載獨(dú)立的 JAXB 工具包但我更推薦直接走構(gòu)建插件因為生成代碼和構(gòu)建流程可以保持同步Schema 一變就重新生成。依賴配置大概長這樣按當(dāng)前主流 JAXB 版本dependency groupIdorg.glassfish.jaxb/groupId artifactIdjaxb-runtime/artifactId version2.3.8/version /dependency如果是新版 Jakarta namespace 的項目需要改用jakarta.xml.bind的坐標(biāo)這里不展開但你必須意識到 JAXB 已經(jīng)被 Java EE 轉(zhuǎn)移到 Jakarta EE 了不同項目的包名前綴不同。3.2 用命令行 xjc 完成第一次生成假設(shè)我在項目的xsd/目錄下放了三個文件xsd-7.xsd、xsd-7-common.xsd、xsd-7-enum.xsd主文件 include 了后兩個。最直接的命令是xjc -d ./generated -p dev.example.xsd7.model xsd/xsd-7.xsd參數(shù)解釋-d指定生成 Java 文件的輸出目錄-p指定生成類的包名末尾緊跟主 Schema 文件路徑執(zhí)行完成之后generated/dev/example/xsd7/model/下會出現(xiàn)一堆.java文件。每個復(fù)雜類型一個文件每個枚舉一個文件可能還包含ObjectFactory.java和package-info.java。ObjectFactory是 JAXB 上下文創(chuàng)建時用于創(chuàng)建各類實例的工廠類package-info.java里則攜帶了命名空間信息包含XmlSchema注解。第一次跑成功之后先把生成的類放到 IDE 里編譯一下看看有沒有編譯錯誤。這里我要特別提一個最常見的問題多個文件互相引用時類名沖突。比如xsd-7-common.xsd里定義了一個叫Status的復(fù)雜類型xsd-7.xsd里也定義了一個叫Status的復(fù)雜類型而且兩個類型語義不同。這種情況下 XJC 在一開始就會報“類沖突”之類的錯誤你需要先在 Schema 層面解決命名沖突或者用 binding 文件給其中一個重命名否則永遠(yuǎn)生成不了代碼。我會在下一章節(jié)詳細(xì)寫這些坑的排查思路。3.3 Maven 插件集成構(gòu)建期自動生成代碼命令行生成一次可以但 Schema 一旦更新手動重新生成代碼并提交到倉庫里很容易產(chǎn)生大 diff也容易忘記同步。我更推薦把 XSD-7 的代碼生成放到 Maven 構(gòu)建生命周期里配置如下plugin groupIdorg.jvnet.jaxb2/groupId artifactIdmaven-jaxb2-plugin/artifactId version0.14.0/version executions execution goals goalgenerate/goal /goals /execution /executions configuration schemaDirectoryxsd/schemaDirectory schemaIncludes includexsd-7.xsd/include /schemaIncludes generatePackagedev.example.xsd7.model/generatePackage generateDirectory${project.build.directory}/generated-sources/jaxb/generateDirectory /configuration /plugin這個配置里最關(guān)鍵的是generateDirectory放在target/generated-sources/jaxb下這樣的話生成的代碼不會進(jìn) Git 倉庫每次構(gòu)建都是全新的。同時 IDE 會自動把target/generated-sources加進(jìn) classpath開發(fā)時調(diào)用生成的類不會有任何區(qū)別。這種做法最大的好處是代碼生成和 Schema 源文件強(qiáng)一致Schema 改了重新編譯就自動更新不用手動維護(hù)一坨生成出來的 Java 代碼。個人經(jīng)驗是讓xsd/目錄納入版本控制生成目錄不納入版本控制。這樣別人拉下代碼也能直接編譯。如果遇到需在 CI 構(gòu)建機(jī)上跑的情況插件會自動下載 XJC 依賴無需額外安裝。4. 第一批生成代碼里的坑命名沖突、非法標(biāo)識符與編碼問題每次生成完代碼我?guī)缀醵家幚硪慌鷨栴}。這些問題不是 XJC 的 bug而是 XML Schema 世界的自然規(guī)則和 Java 語言規(guī)則之間的摩擦。如果你提前知道它們排查起來會快很多。我挑幾個高概率遇到的講一講。4.1 XML 名稱與 Java 關(guān)鍵字的碰撞XSD-7 里出現(xiàn)過這種情況某個元素叫xs:element nameclass ...比如字段名就叫class。這在 XML 里完全合法但映射成 Java 字段時就成了關(guān)鍵字直接編譯不過。XJC 遇到這種情況一般會做某種轉(zhuǎn)義有時會自動生成一個類似classValue或_class的字段名但有時又不會結(jié)果就是編譯錯誤。真正的解決方式是在綁定文件里自定義屬性名。類似地還有abstract、interface、native等。我遇到過最離譜的一個是元素名叫package生成字段變成了_package——這還是 XJC 默認(rèn)給加了下劃線前綴的結(jié)果。所以生成完代碼之后第一件事就是在 IDE 里全局編譯把所有語法錯誤揪出來。4.2 兩個Status類的生死沖突多 Schema 文件項目中命名沖突概率比我預(yù)想的高很多。XSD-7 主文件里定義了一個Status復(fù)雜類型某個被 include 的子 Schema 里又定義了一個Status簡單類型這就是典型的“同名不同類型”。XJC 在遇到這兩個類型時如果恰好被分配到了同一個 Java 包就會產(chǎn)生同名類沖突命令執(zhí)行到一半就報錯。這種情況我建議優(yōu)先在 XML Schema 層面解決也就是讓 Schema 提供方改名。但如果外部系統(tǒng)不規(guī)范、沒法推動那就只能在 binding 文件里對其中一個類型額外指定類名。綁定文件的內(nèi)容類似jaxb:bindings version1.0 xmlns:jaxbhttp://java.sun.com/xml/ns/jaxb xmlns:xshttp://www.w3.org/2001/XMLSchema jaxb:bindings schemaLocationxsd-7.xsd node/xs:schema jaxb:bindings nodexs:complexType[nameStatus] jaxb:class nameOrderStatus/ /jaxb:bindings /jaxb:bindings /jaxb:bindings這段綁定的意思是在xsd-7.xsd里找到名為Status的復(fù)雜類型把它生成的 Java 類名改為OrderStatus。這樣兩個 Status 就能共存了。4.3 枚舉值里的空格、連字符和數(shù)字開頭枚舉值的坑我在前面提到過。XSD-7 的幣種枚舉還算常規(guī)但有一段報文里的枚舉值居然是HIGH-RISK、LOW_VALUE、3RD_PARTY這種風(fēng)格。XJC 默認(rèn)生成枚舉常量時會做非法字符替換比如HIGH-RISK會變成HIGH_RISK3RD_PARTY會變成_3RD_PARTY。單個看沒問題但萬一你有兩個枚舉值分別叫HIGH-RISK和HIGH_RISK一個是連字符一個是下劃線XJC 替換之后兩個都指向HIGH_RISK就沖突了。我的處理辦法是在綁定文件里給每個枚舉值顯式指定成員名用typesafeEnumMemberName或者typesafeEnumMember。到了這一步你也會發(fā)現(xiàn)外部系統(tǒng)發(fā)的枚舉里“同含義不同寫法”的情況特別多手動指定反而是最穩(wěn)妥的。4.4 編碼問題漢化注釋和亂碼XSD-7 里如果帶有中文注釋、中文描述性文檔XJC 默認(rèn)生成的 Java 文件里的注釋通常能保留但前提是文件編碼一致。我遇到過 XSD 文件里聲明?xml version1.0 encodingUTF-8?但文件本身是 GBK 編碼的情況導(dǎo)致生成的注釋全是亂碼。更常見的坑是 Windows 平臺下命令行 xjc 默認(rèn)輸出編碼不匹配Java 源碼里出現(xiàn)奇怪的字符。我的建議所有 Schema 文件統(tǒng)一轉(zhuǎn)成 UTF-8 編碼命令行上加-encoding UTF-8參數(shù)Maven 插件側(cè)也要配置項目編碼為 UTF-8。這塊是純環(huán)境問題但真遇到了會浪費(fèi)不少時間。xjc -d ./generated -p dev.example.xsd7.model -encoding UTF-8 xsd/xsd-7.xsd5. 外部綁定文件實戰(zhàn)讓 XJC 按你的規(guī)范生成代碼XJC 默認(rèn)生成的代碼能滿足“能用”的要求但往往不滿足“好用”的要求。比如日期類型映射成XMLGregorianCalendar就非常難用序列化 JSON 時也很別扭。好在 JAXB 提供了強(qiáng)大的外部綁定機(jī)制你可以寫一個.xjb文件來覆蓋各種默認(rèn)映射讓代碼更符合項目的實際需要。5.1 日期時間類型從 XMLGregorianCalendar 換到 LocalDate/LocalDateTimeXSD 里的xs:date、xs:dateTime默認(rèn)映射成javax.xml.datatype.XMLGregorianCalendar。這個類本身沒問題但日常開發(fā)用起來極其繁瑣和 JSON 序列化、數(shù)據(jù)庫操作都不搭。我強(qiáng)烈建議通過javaType定制把日期映射為 Java 8 時間類型。實現(xiàn)方式有兩種一種是在jaxb:globalBindings里直接定制全局類型映射另一種是寫一個XmlAdapter并配合XmlJavaTypeAdapter注解。全局綁定的例子jaxb:bindings version1.0 xmlns:jaxbhttp://java.sun.com/xml/ns/jaxb xmlns:xshttp://www.w3.org/2001/XMLSchema jaxb:globalBindings jaxb:javaType namejava.time.LocalDate xmlTypexs:date parseMethodcom.example.adapter.JaxbDateAdapter.unmarshal printMethodcom.example.adapter.JaxbDateAdapter.marshal/ /jaxb:globalBindings /jaxb:bindings這里parseMethod和printMethod指向一個自定義類里的兩個靜態(tài)方法。對應(yīng)適配器類類似這樣public class JaxbDateAdapter { public static LocalDate unmarshal(String v) { return v null ? null : LocalDate.parse(v); } public static String marshal(LocalDate v) { return v null ? null : v.toString(); } }這樣從 XML 反序列化時XJC 就會自動調(diào)用unmarshal把字符串轉(zhuǎn)成LocalDate序列化時調(diào)用marshal輸出標(biāo)準(zhǔn)字符串。改造過后生成的 Java 類字段類型就是LocalDate了讀寫和業(yè)務(wù)層面都干凈很多。5.2 金額類型確保 decimal 映射到 BigDecimal 而不是 doubleXSD-7 里金額字段用的都是xs:decimal默認(rèn)映射是BigDecimal這個沒問題。但常見的問題是自定義類型里寫了basexs:double或basexs:float這會導(dǎo)致金額字段變成double精度上很容易出問題。外部系統(tǒng)如果這么設(shè)計我一般會在 binding 文件里把該簡單類型強(qiáng)制改掉jaxb:bindings schemaLocationxsd-7.xsd node/xs:schema jaxb:bindings nodexs:simpleType[nameMoneyType] jaxb:javaType namejava.math.BigDecimal xmlTypexs:decimal parseMethodcom.example.adapter.DecimalAdapter.unmarshal printMethodcom.example.adapter.DecimalAdapter.marshal/ /jaxb:bindings /jaxb:bindings雖然xs:decimal默認(rèn)就是 BigDecimal但顯式聲明一次能防止某些插件版本或者 XSD 變體把它降級也能給人提示這個字段是金額不是普通小數(shù)。5.3 重命名類和字段的通用姿勢前面講了用jaxb:class name.../修改類名。對于字段名可以在對應(yīng)元素節(jié)點上用jaxb:property name.../修改jaxb:bindings schemaLocationxsd-7.xsd node/xs:schema jaxb:bindings nodexs:complexType[nameOrderInfo] jaxb:bindings node.//xs:element[nameclass] jaxb:property nameclassField/ /jaxb:bindings /jaxb:bindings /jaxb:bindings這種 node 路徑的寫法和 XPath 非常像其中.//表示從這個復(fù)雜類型下任意層級找元素名為class的節(jié)點。注意property name的值需要遵循 Java 字段命名規(guī)范一般用小駝峰。這里我提醒一點綁定文件本身也要納入版本控制并確保每次 XJC 運(yùn)行時都通過-b參數(shù)指定。命令行是xjc -d ./generated -p dev.example.xsd7.model -b binding.xjb -encoding UTF-8 xsd/xsd-7.xsd如果 binding 文件里寫錯了 XPathXJC 會報錯說找不到節(jié)點這時多半是schemaLocation或者node寫得不精確??梢园?XSD 文件在 XML 工具里格式化之后用瀏覽器或編輯器自帶的 XPath 輔助確認(rèn)路徑。5.4 用 extension 模式處理 XML Schema 1.1 特性XSD-7 這種新版本契約有時候會用上 XML Schema 1.1 的xs:assert、xs:alternative、xs:openContent等特性。默認(rèn)的 XJC 對 1.1 支持并不好特別是xs:assert因為它屬于約束規(guī)則XJC 基本不會轉(zhuǎn)換到 Java 端。應(yīng)對方法是給 XJC 開啟-extension參數(shù)這樣它能解析更多 1.1 語法避免因為遇到不認(rèn)識的元素直接報錯。xjc -extension -d ./generated -p dev.example.xsd7.model xsd/xsd-7.xsd注意-extension不是萬能鑰匙它只是讓 XJC 放寬了解析范圍對于xs:assert這類規(guī)則JAXB 沒有對應(yīng)的運(yùn)行時校驗機(jī)制生成代碼不會自動做這些斷言檢查。如果用得上你仍然需要在業(yè)務(wù)層或者實際 schema 校驗里去處理這些業(yè)務(wù)規(guī)則。6. 生成代碼之后的生產(chǎn)力工作流從“能用”到“好用”XJC 生成完代碼工作其實只完成了 40%。把生成代碼整合進(jìn)實際項目并保證長期可維護(hù)性才是接下來真正花時間的地方。這塊我講講自己積累的工作流和習(xí)慣。6.1 生成代碼只讀策略用擴(kuò)展方法而不是改生成文件剛接觸 XJC 的時候我也干過直接修改生成類來加業(yè)務(wù)邏輯的事。結(jié)果就是 Schema 一更新代碼重新生成我改過的邏輯全沒了。后來我定了一個紀(jì)律生成代碼一律不手動修改需要擴(kuò)展行為時要么用XmlJavaTypeAdapter、要么在生成類基礎(chǔ)上做包裝類/擴(kuò)展類、要么用繼承覆蓋共性邏輯。對序列化輸出有特殊要求時優(yōu)先用注解定制而不是改代碼。維護(hù)這份紀(jì)律的最大好處是生成目錄隨時可以刪了重新生成完全無痛。比如需要給訂單類加一個業(yè)務(wù)方法totalAmountWithTax()我不會去動OrderInfo類而是在業(yè)務(wù)層建一個輔助服務(wù)或者用abstract父類做模板。6.2 多模塊項目里把生成代碼隔離成獨(dú)立模塊單模塊項目里把生成代碼放在target/generated-sources直接編譯問題不大。但如果你在做一個多模塊的微服務(wù)項目我建議把 XJC 生成邏輯單獨(dú)放到一個 Maven 模塊里比如xsd-api-model。這個模塊只負(fù)責(zé)承接 Schema 和生成代碼對外只暴露生成的 Java 類型。業(yè)務(wù)模塊依賴這個模塊即使 Schema 更新頻繁、類名發(fā)生變動影響面也只在接口層不會牽扯到所有服務(wù)代碼。這么做還有一個額外好處你可以在xsd-api-model里統(tǒng)一存放 binding 文件和適配器類做到生成邏輯和調(diào)用方隔離。如果未來換了 Schema 版本或改用了新協(xié)議只需要改這個模塊。6.3 自動化校驗把 schema 變更納入構(gòu)建門禁我們團(tuán)隊后來還加了一步在 CI 構(gòu)建里跑mvn generate-sources之后會做一個編譯檢查和 spotbugs 掃描保證生成的代碼沒有低級問題并且和業(yè)務(wù)模塊兼容。Schema 一旦被外部供應(yīng)商修改了本地編譯直接失敗提醒開發(fā)者需要重新評審和適配而不是等代碼里出現(xiàn)一堆不明所以的編譯錯誤才發(fā)現(xiàn)。這種門禁很實用。我遇到過不止一次外部供應(yīng)商悄悄改了 XSD-7 里某個字段的 minOccurs從 0 改成 1本地沒注意結(jié)果上線之后報文反序列化到處報錯。如果每次 Schema 變更都能通過構(gòu)建記錄展示變更差異你就能第一時間發(fā)現(xiàn)這些隱性破壞。6.4 處理 equals、hashCode 和 toString默認(rèn)生成的 JAXB 類是不帶 equals/hashCode/toString 的這給日志打印、斷言測試帶來很大麻煩。插件社區(qū)有兩個常用方案一個是依賴 Lombok在生成后手工補(bǔ)充注解——但這就違反了“不改生成代碼”的原則另一個是使用 JAXB 的XmlTransient基類或者干脆在業(yè)務(wù)層統(tǒng)一寫工具函數(shù)來比較對象字段。我自己常用的方式是寫一個公共工具類用反射比較兩個生成對象的所有字段值。雖然反射有點性能開銷但測試環(huán)境和開發(fā)環(huán)境足夠用。線上如果有復(fù)雜對象比對需求建議用 JSON 序列化之后的字符串來比較直觀且不依賴字段順序。6.5 從舊版 JAXB 遷移到新命名空間的注意點如果你在維護(hù)一個老項目從javax.xml.bind遷移到j(luò)akarta.xml.bindXJC 生成的代碼注解也會變。這個過程看著只是包名替換但實際涉及很多細(xì)節(jié)XmlRootElement、XmlType、XmlAccessorType等注解的包名都要換ObjectFactory和package-info里的命名空間常量也有變化。最簡單的方式是把 XSD 重新喂給對應(yīng)版本的 XJC 插件生成一遍而不是用文本替換去硬改。我在一次項目升級里試過硬改結(jié)果就是大量編譯錯誤和運(yùn)行時ClassCastException?,F(xiàn)在 JAXB 生態(tài)已經(jīng)分叉了你用的 XJC 版本必須和項目里的 JAXB 運(yùn)行時版本保持同一條主線否則生成的注解和運(yùn)行時對不上啟動時會出現(xiàn)各種“找不到注解”的坑。7. 最后說幾個比較偏門但關(guān)鍵時刻能救命的參數(shù)XJC 命令還有很多參數(shù)我平時用不著但遇到特殊情況能派上大用場。這里列幾個我覺得值得記住的。-nv參數(shù)表示不執(zhí)行嚴(yán)格校驗。默認(rèn)情況下 XJC 會對 Schema 做驗證如果 Schema 本身寫得不太規(guī)范比如用了過時的語法或者缺少某些聲明命令會直接中止。加-nv可以讓它在盡量寬松的模式下完成編譯。不過要注意跳過校驗的結(jié)果是生成的代碼質(zhì)量可能存疑適合在“明知 Schema 有問題但必須先拿到代碼看看”的場景下使用。-catalog參數(shù)用來指定一個 XML Catalog 文件很多項目里會有本地的 DTD/XSD 文件解析依賴。遇到 XSD 文件里的 import 指向一個互聯(lián)網(wǎng)地址公司內(nèi)網(wǎng)又訪問不了時寫一個 catalog 把這些 URL 映射到本地文件就能解掉。-no-header參數(shù)可以生成的 Java 文件不附帶生成時間、版本信息之類的頭部注釋這樣代碼 diff 更干凈也避免每次發(fā)布版本時生成代碼的頭部注釋變化導(dǎo)致無意義的 diff。另外還有-quiet參數(shù)可以減少輸出信息適合在腳本里調(diào)用避免日志被大量警告刷屏。我一般在 CI 腳本里會把-quiet加上方便在全是生成日志的構(gòu)建輸出里快速檢索真正的問題。如果你用的是 Maven 插件這些參數(shù)都有對應(yīng)的 XML 配置項可以對照插件文檔逐一映射。命令行驗證好參數(shù)效果之后再落到插件配置里。還有一個值得提的點是XJC 處理xs:any類型時默認(rèn)會生成一個org.w3c.dom.Element成員如果你非要讓那個字段變成Object或者接進(jìn)某個自定義類型只能借助插件或者二次處理。這個問題比較底層大多數(shù)情況下用默認(rèn)的Element類型也夠用但要知道它為什么不是業(yè)務(wù)可以直接使用的強(qiáng)類型對象。8. 一次完整對接流程的實際操作清單最后我把一次典型的“拿到 XSD-7 到代碼可用”的完整流程列出來給各位一個參照。我?guī)缀趺看螌佣际前催@個清單走穩(wěn)定可靠極少出岔子。第一步先把整個 Schema 文件集放到統(tǒng)一目錄比如項目下的xsd/同時確認(rèn)文件編碼都為 UTF-8。第二步通讀主 Schema重點記錄targetNamespace、外部 include/import 文件、全局復(fù)雜類型和全局簡單類型數(shù)量判斷是否存在命名沖突風(fēng)險。第三步確認(rèn) JDK 版本和 JAXB 坐標(biāo)選擇命令行還是 Maven 插件生成。如果項目本身就是 Maven 項目我強(qiáng)烈建議直接配插件。第四步準(zhǔn)備好 binding 文件顯式指定目標(biāo)包名并對日期、枚舉、沖突命名做定制。第五步執(zhí)行生成命令把生成代碼刷新到 IDE編譯排查語法錯誤。第六步找一個真實樣例報文寫 JUnit 測試做一次反序列化和序列化的雙向驗證確認(rèn)生成代碼可以和實際報文正確匹配。第七步調(diào)整 Schema 版本管理策略正式納入構(gòu)建流程。這套清單看起來簡單但每一步都會攔住一部分人。特別是第六步很多同學(xué)生成完代碼直接就開始寫業(yè)務(wù)等聯(lián)調(diào)的時候才發(fā)現(xiàn)字段映射不對通用的做法是先拿一段真實報文跑通Unmarshaller再寫業(yè)務(wù)邏輯。Unmarshaller的使用方式也順便放這里JAXBContext context JAXBContext.newInstance(OrderEnvelope.class); Unmarshaller unmarshaller context.createUnmarshaller(); try (InputStream in new FileInputStream(sample-request.xml)) { OrderEnvelope envelope (OrderEnvelope) unmarshaller.unmarshal(in); OrderInfo order envelope.getOrderInfo(); // 業(yè)務(wù)邏輯... }這樣能確認(rèn)生成類與真實報文的字段對應(yīng)關(guān)系是否正確。如果字段類型配錯了或者枚舉對不上在這里就能直接暴露出來不用等到線上。試過這么多方案之后我的核心體會是XJC 生成代碼只是起點真正考驗功力的是你如何把綁定文件、構(gòu)建流程、測試驗證和代碼隔離這套體系搭好。XSD-7 這類文檔以后還會有新的版本但對 Java 開發(fā)者來說核心邏輯不會變先理解 Schema 結(jié)構(gòu)再用 XJC 把重復(fù)勞動自動化最后用 binding 文件持續(xù)優(yōu)化類型細(xì)節(jié)。這套能力一次投入后面每次對接都能復(fù)用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
伊人久久综合精品欧美| 人妻人人做人人澡人人爽欧美一区| 综合熟妇一区二区三区| 97超碰站| 91呆哥人妻| 日本一区二区电影网站| 亚洲欧美天| 国产v亚洲v日韩v欧美v片另类| 欧洲大香蕉| av天堂电影网| 屁屁影院一区二区三区国产 | 91日产桃蜜| 欧美偷拍区| 婷婷中文字幕| 国产97在线播放| 日韩人妻一二三区视频| 日韩pv中文| 中文久久96| 超碰色综合| 69人妻精品一区二区绯色| 亚洲综合69| 亚洲欧洲综合成人av一区| 欧美日综合| 夜夜嗨绯色| 搡老女人老熟女91| 亚洲色91C| 日本黄色大片一级视频免费麻豆| 麻豆久久久久久久久丝袜 | 色色婷婷五月| 国产精品视频在线观看| 国产97色在线| 亚洲脚交| 最新日产中文在线麻豆| 操b在线观看| 亚洲黑丝在线| 国产亚洲色停停久久99精品91| 国产精品色哟哟| 欧美日本成人一区二区| 蜜臀久久99精品| 日日摸夜夜夜夜爽| 使劲用力艹少妇视频一区二区 | 96免费视频在线| 99热在线播放| 欧美黑人熟妇精品91| 青青草久草| 日韩AV一区二区三区三州三州| 亚洲精品黑丝| 久久99午夜精品一区人妻| 亚洲免费97免费| 操逼A∨| 99久久婷婷国产综合精品草原| 超碰99re| 中文乱码99| 久久性爱大全| 亚洲图片欧美| 欧美春色| 91国产操逼视频| 熟妇高潮一区二区免费视频| 丁香婷婷五月| 91亚洲网站| 玖色AV| 人人妻人人玩人人澡人人爽| 97视频900| 日韩精品99999| 中文字幕激情小说| 精品人妻一区春色| 国产欧美伊人| 亚洲国产一级黄色视频| 在线播放中文字幕| 日本一二三高清| 一级人妻性爱视频| 少妇蹲下买菜露大唇0| 91ise欧美| 99热只有这里有精品| 日本高清一本二本免费不卡| 亚洲熟妇无码一区二区三区| 超碰在线91| 欧美成人一级免费电影| 亚洲A曰本VA欧美VA视频| 成人一区二区三区四区| 99热这里只有精| 日本性爱少妇| 国产一区在线观看无码AV| 伊香蕉综合久久久久久久噜噜噜| 久久的网站啊啊啊啊啊| 日韩精品人妻系列无码天堂| 五月天色综合| 国内毛片无码一级毛片| 日本性交操一区二区不卡系列| 欧美成97爱| 久久女女| 国产伊人精品在线| 日少妇亚洲版| 熟女中出视频| 艹我哪美一区无码| 97天天摸天天碰| 亚洲啪啪性视频| 手机看片1025| 91中文在线| 97人妻碰碰中文无码久热丝袜| 九九九九热| 国产精品乱码久久久久| 亚洲高清自拍| 国产一国产一级毛片古装| 天天综合网在线观看| 啊啊啊啊,啊啊好多水| www.男人天堂| 九九超碰综合网| 一二视频神马久久传媒| 欧美日韩不卡传媒| 久久久久元码视频| 久久久111| 啊啊啊要高潮了| 97视频900| 国产精品天干天干综合网麻豆| 成人在线视频一区| 亚洲老司机123专区| 色好看av| 九久久精品| 人人综合| 亚洲骚男同com| 91网站在线播放| 日本久久久精品电影| 婷婷国产精品一区二区| 高潮的A片激情扒开一区| 婷婷av在线中文字幕| 欧美18 在线观看| 欧美精品成人在线播放| 日本免费中文一区二区三区四区| 97人人中文网| 91精产一区二区三区| 日韩无码服务区| 欧美激情区| 精品99999| 亚洲黄片免费在线播放| 操国产高清| 岛国片在线播放| 日韩av免费一级电影| 日韩人妻中文视频| 久久久久久大| 9久9久9久9久视频网站| 日本国产亚洲一区在线观看| 小情侣高清国产在线视频| 天天日天天插| 成年男人的天堂| 亚洲乱色视频一区、二区在线| 国产25页| 97超碰色色| 国产av又色又爽又黄| 伊人AAA| 欧美五区| 嗯嗯啊啊啊好爽| 91啦人妻| 久久怡红院| 精品久久9| 97超碰欧美手机| 丰满岳乱妇一区二区三区| 久久综合五月天| 久久只有精品一区二区三区| 国产馆| 天堂中文日本在线观看| 日本丝袜美腿人妻九九| 欧美 亚洲| 黄片国产精品一区二区| 日韩情色视频| 黄久在线| 伊人丁香五月婷婷| 日韩pv中文| 午夜啊啊| 强奸乱伦αv片| 久久a久久| 欧美一区二区| 亚洲人妻AV| 精品人妻视频一区二区在线播放 | 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 久久婷婷综合国际产色怕| 麻豆天美传媒在线视频天堂| 久久春色| www.狠狠干.coom| 日本国产二线女色| 国产成人精品日本视频| 日本高清加勒比| 啊啊啊啊好疼| 五月天丁香网| 91N综合网| 中国东北熟女老太婆内谢| 亚洲AV资源| 草草草视频在线免费看| 亚洲,欧美,春色,另类| 亚欧操逼片在线观看| 在线观看成人性爱免费小视频| 丝袜美腿欧美| 在线播放免费av福利片| 亚洲AV不卡在线观看| 少妇无码av专区线| 另类 综合 日韩 欧美 亚洲| 狼狼色丁香久久婷婷综合五月| 欧美激情视频一区二区三区不卡| 国产在线播放成人免费| 国产精品制服丝袜中文字幕日韩一区二区三区 | 四虎影视在线| 亚洲欧美国产中文视频| 国产成人AV麻豆| 亚洲欧美一区二区网址| 久久超碰98| 日韩欧美成人午夜福利| 偷拍五区| 欧美人人AAA| 精精品人妻一区二区三区| 嗯嗯啊啊视频在线看| 91色宗合| 精品射1999| 精品国产91内射久久| 久久神马影院| 日本福利二区视频| 9Ⅰ老熟女| 欧美日韩高潮喷水91| 国产强奸乱伦无码视频| 亚洲九九视频在线观看| 9九九九九视频在线观看| 五月亭亭六月丁香| 天天日美女的B| 亚洲精品日韩国产欧美| 18禁看网站一区| 欧美日动态视频| 亚洲黄网在哪免费看| 精品人妻一区二区三区免费视频| 精品一区二区三区最新| 久久综合亚洲色1080p| 九九九国产精品| 亚州情色j区| 欧美成人性爱视频在线播放| 国产精品不卡一区二区三区| 91久久99久久91熟女精品| 蜜臀在线视频| 男人天堂久久精品不卡| 插入综合网| 日韩无码视频黄色| 精品人妻一区二区三区不卡断 | 亚洲av综合色| 色妇综合网| 嗯嗯啊啊好疼| 99色悠悠| 亚洲成人久久美女| 国产又色又粗又黄又爽| 春色91| 精品久久久久久久久久久久| 日韩有码一区三区| 首页中文字幕中文字幕免费| 天天综合91| 久久久九| 美美91成人国产精品欧美精品久久久久久久| 思思热免费视频观看| AV乱伦专区| 国产蜜臀精品一区二区尤物| 小草av不卡亚洲二区 | 啪啪视频亚洲第一| 另类图片综合| 农村少妇久久久久久久| 超碰97欧美日韩| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 91熟女丨91老女人| 亚欧美无遮挡| 亚洲日韩少妇一道本视频| 精品久久久九九九孕妇| 开心五月婷婷激情| 99久久婷婷| 色综合久久88色综合久久天天| 另类天堂| 精品久久艹| 欧美久久婷婷| 色诱avtt| 超碰97男人| 欧美 亚洲 制服 精品| 欧美精品日韩一区二区| 日本色色色视频| 天天躁日日躁xxxxx| 亚洲色图欧美色图另类图片| 欧美色女人| 久久久久久久91| 欧美丝袜91| 亚洲久久东京热一二三四五区视频| 99啪啪视频| 日韩无码嘿咻黑热久| 色99视频| 日日干夜夜干| 激情五月天综合网| 男人的天堂啪啪啪啪啪蜜桃不卡| 99热婷婷| 日韩啪啪啪啪啪| 激情六月天| 天天干天天插| 91丝袜美女| 成人在线视频二区| 熟女丰满人妻一区| 操逼精品视频| 久久啊啊啊视频| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 大香蕉日亚洲日本亚大| 加勒比久久av| 亚洲av资源| 欧美性爱超碰97| 男人天堂2030| 女人天堂av在线播放| 亚洲无线观看久久| 五十路三区在线| 东京热毛片177b2viP| 97在线免费| 91一区二区三区蜜桃| 九九视频黄色片| 做爱A级亚欧| 看黄片视频免费| 国产极品精品美女视频| 亚洲欧美日韩夜夜| 亚洲天堂,男人| 天天干2019| 国产精品。| 蜜桃精品一区二区三区久在线| 人澡逼| 高清孕妇孕交 交| 97久久精品| ji熟女.com| 粉嫩在线一区二区懂色| 青草青青久久久久久国产| 九九久久国产精品| 伊人在线大香蕉视频久久| 三及片网站| 丰满美女一级毛片在线播放| 亚洲天堂7777| 欧美制服另类丝袜| 粉嫩久久久久| 97超碰美女| 国产精品久久久久久久电影渣男| 91一起操| 一区,二区,三区视频| 精品无码一区二区三区| 久久精品一区二区一8| 干干干天天| 97色碰| 草久久久| 蜜臀久久99精品久久久电影| 亚洲砖码砖专无区2023| 东北黄色电影| 超碰欧美97资源| 亚洲日韩人妻中文字幕一区| 久久艹逼视频| 亚洲AV色图一区| 韩国免费播放一级毛片| 五月婷婷六月激情| av草草在线电影| 97免费在线视频| 不卡啪啪视频| 天天热精品| 在线午夜成人无码视频| 97超级久久强资源| 中文字幕日韩情色| WWW啪啪的com| 美女露胸露屁股| 婷婷20月天青娱乐| 亚洲精品精品一区二区| 人妻黑丝袜电影| 国产一级高清免费观看| 操逼日韩无码| 最新9久久久9免费视频| 伊人一区二区在线播放| 天天综合网国产| KK色在线影院| 岛园激情| 久久人妻无码毛片A片麻豆| 啪啪视频免费在线观看| 青青草操逼逼视频| 91精品91久久久中77777| 国产激情av女片自拍| 亚洲精品欧洲精品| 在线岛| 欧美爆操91| 农村女一级毛卡片| 怡红院视频在线| 精品一区二区三区蜜桃| 91九色精品熟女内射| 国产成人精品一区| www.黄色在线| 亚洲色入欧美| 国产女人与拘做受视频免费| 久久成人午夜狠狠| 亚洲人妻中文高清| 蜜臀th| 另类一区| 精品一区二区三区18| 探花精品视频| 狠狠爱夜夜| 依人大香蕉| 久操国产在线| 国产欧美伊人| 人人操人人爽人人操人人| 人妻密肉在线观看| 欧美Aⅴ| 久久久99999久网站| 亚洲欧美在线观看免费| 天天搞欧美| 色婷婷激情| 中文字幕在线免费观看 | 色性综合| 天天躁日日躁成人字幕aⅴ| 97中文字幕色| 岛国片国产成人亚洲播放| 日韩一级二级在线| 免费无码国产精品v片在线观看| 亚洲美女色图| 国产福利影视| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 久96热在线观看视频| 台湾佬中文娱乐自偷自拍| 日韩视频精品在线观看| 久草久日| 人人乐大香蕉| 久久成人国产| 蜜臀久久99精品久久久电影| 熟女网站最新| 日本三级大片| 1人人看人人摸人人操| 亚洲日韩XXX| 99色热| 色哟哟AⅤ| 中文熟女五十乱码在线| 69超碰综合| 91香蕉视频在线观看免费| 欧美后入式| 日韩一区二区熟女| 在线强奷到舒服的无码视频 | 2019亚洲男人天堂| 加勒比大香蕉视频在线| 国产精品99精品视频网站| 成人开心网在线视频 | 久久久无码av精| 韩国三级色呦呦| 秋霞鲁丝午夜无码一区二区三| 中文字幕一区二区三区视频播放| av爱爱爱| 天天92av| 久久r精品| 91亚州欧美| 九九伊人网| 日韩三A大片在线观看| 欧美男人的天堂| 日本最新免费韩国1区2区视频播放| 亚洲色诱惑| 国产 日韩 欧美高清| 自拍六区| 69久久| 国产白嫩漂亮KTV在线| 日本天天干天天操一区| 人妻丝袜肏逼| 熟妇视频一区二区三区在线观看| 亚洲欧美国产日本一区二区三区| 翔田千里AⅤHD无码| 台湾佬大香蕉| 蜜臀在线网站| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 中文字幕久久精视频久久大全| 综合色99| 99久久精品国产高潮| 91丨豆花丨熟女| 欧美性天天| 少妇色欲综合网2| 国产一区二区三区久久精品太古里| 91国产精品在线看| 成人片在线播放| 人人摸人人干人人拍97| 色哟哟511老熟女| 十八禁视频一区二区| 亚洲久9| 亚州欧美在线| 亚洲人妻色图| 丝袜AV一区二区三区| 精品免费成人久久| 99精品无码| 天堂av最新电影网| 欧美性Fer办公室秘书| 91久久久老司机| 夜精品久无码| 午夜福利在线合集| 亚洲色图欧美色图制服诱惑| 夜夜操一区二区| 韩日精品福利视频一区不卡在线免| 亚洲精品天天影视综合网| 91在线免费观看处女| 天天干天天日天天射黄色| 国模限制级电影| 久久啊哟| 99精品网站| 精品97久久综合| 久久99精品九九久久久婷婷| 欧美日韩美女精品久草一区二区三区| 劲爆欧美人妖三区91| 另类成人首页一区| 加勒比综合在线| 九九九九精品视频| 亚洲高清视频在线免费观看| 成人影院永久免费观看网址| 逼逼逼逼操操操操操操操操操午夜剧场| 麻花豆传媒剧国产MV出差| 国产91啪| 久久九九网| 亚洲图片 91| 天天操女人| 狠狠亚洲| 99久久99九九99九九九| 国产强奸AV在线| 中文字幕一区二区三区高清| 天天躁日日躁AAA片李宗瑞| 久久婷婷视频| 日本A级视频| 97欧美色综合| 欧美大片91| 精品人妻中文字幕4399| 99热啪啪| 中文字幕88av在线| 91亚.色| 亚洲色天| 欧美日本国产日韩激情视频| 日本有码久久| 日韩精品影视| 婷婷超| 8050午夜少妇无码| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 色眯眯av| 97爱综合| 成人免费在线网站| 午夜久久一区二区无码中出| 丝袜色综合| 免费a v| 午夜高清成人在线视频| 人妻在线中出视频| 激情内射| 亚洲精品一区二区精品| 婷婷五月在线视频| 日韩资源网| 啊啊啊在线观看| 人人操人人摸人 | 久久婷五月| 韩国女主播青草在线| 国产免费小视频| 日韩精品一区二区日韩| 九九九网页| 久久中文字幕人妻熟av女蜜柚| 日韩精品在线放| 天天爱天天韩国日本牛牛牛牛| 人妻少妇精品久久久| 中文字幕熟女人妻丝袜| 99久在线精品99re8| 97日视频| 黄色免费一级在线毛片| 成人五月香网在线| 久久激情视频| av天堂5| 国产精品久久久999| 天天射天天操天天干天天吃2018| 一起草AV| 这里只有97精品| 久久免费精品视频免一| 韩日精品福利视频一区不卡在线免| 免费精品无码一级毛片牛牛影视 | 人妻 中文 日韩| 中文字幕97色| 摸奶性爱视频网站在线免费播放| 熟女人妻av在线资源,黄色的资源| 欧美在线|亚洲| 国产自产一区视频在线| 裸体美女久久久| 加勒比在线观看一区二区| 青青草久久一区网| 人人看黄色视频| 久久伊人在线五区| 84YTCOM性无码| 性欧美另类高清| 日少妇视频| 又大又白奶子| 性综合网| 少妇与黑人高潮在线| 人妻另类 专区 欧美 制服| 花野真衣| 成人五级久久| 中 文字幕一区二区三四 五 区日 日 骚| 一起草三级AV电影在线观看| 艾草av| 国产日韩欧美操逼视频| 素颜老阿姨乱情色| 国产综合网站在线播放 | 91黑丝少妇| 无遮挡男女激烈动态图| 蜜臀精品1区2区| 久久性爱视频99| 国产精品视频| 国产激情在线| 中文字幕第2页| 欧美综合97www| 国产精品一区av在线| 福利在线视频一区二区| 中国亚洲呦女专区| 不卡在线观看视频| 裸模AV女优| av无码精品久久久久| 玖色av| 成年女人一区| 成人乱人伦一区二区| 青青草好吊| 天天日夜夜| 黄色香蕉视频网站一区| 婷婷九月国产| 91色综| 欧美激情另类一区二区| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 97在线视频观看网站| 啊啊啊在线看| 操穴国产| 丰满少妇乱子伦精品无| 国产精品久久久久久久久久久久| 粉嫩AV一区夜夜嗨| 欧美日综合| 人人操人人干xxx| 午夜福利一区二区三区四区五区色婷婷| 红杏大香蕉| 一本久道在线综合视频| 蜜臀网 一区| 欧美性爱一区二区三区四区 | 97人人夜夜精品视频| 久久风骚城市| 极品少妇99| 超碰狠狠操| 日本三级A片网站com| 99精品九九九九九九| 91在线丝袜视频| 天天干天天插| 青娱乐国产精品| dy888午夜老子影视达达兔| 欧美成人国产精品| 九九热免费在线国产视频伊人五月| 国产精品无码论坛| 欧美自拍偷拍综合图片| 2017天天插| 亚洲诱惑天堂| 丰满搜索结果 -第18页- 久久高清无码 | 就去色综合| av东京热男人的天堂| 97午夜剧场日韩| www.色操逼| 国产欧美精选激情视频| 丁香色狠狠色综合久久小说| 亚洲区 欧美区| 亚洲中亚日激情视频| 国产乱弄免费在线视频。| 亚洲有码 欧美精品| 欧美视频边做饭边橾| 秋霞网—男女啪啪亚洲免费体验区| 欧洲精品一级二级精品综合视频综合 | 久久久久9999| 欧美日韩性爱无码| 人妻丰满熟妇一区二区三| 亲子敌伦对白在线播放| 国产综合久久久麻桃个| 91N综合网| 熟女熟妇伦久久影院毛片一区二区| 国产青视频| 在线人妻熟女一区二区三区四区五区| 熟妇人妻精品一区二区视频色欲| 成人片在线播放| 怡红院一区二区熟女人妻| 黑人操一区二区| 先锋色眉乱伦资源| 亚洲国产精品有声| 日韩无码a片| 成人麻豆av电影网站| 国产传媒午夜理伦精品| 国产成人精品必看| 大学生口爆吞精| 韩国一级婬片A片无码天美 | 啊啊啊免费视频| 久久这里只| 72av视频| 91久久久久久久久18| 99999精品| 国产强奸无码乱伦| 国产精品点击进入在线影院高清| 欧美组图日韩亚洲中文字幕| 国产精品com| 日韩成人精品| 伦伦成年午夜免费视频| 久久精品国产亚洲AV片多多| 婷婷中文网| www久| 亚洲色吧网| 二区熟妇韩日| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 日韩精品亚洲一二三| 欧亚三区动漫| 精品一级毛片在线观看| 在线有码中文字幕| 日本一区二区三区四区免费观看| 日韩成人大片在线观看| 欧美日不卡| 久久久婷婷| 欧美亚洲综合999| 国产美女91| 思思热一热婷婷热一热| 爽极品影院| 中文字幕av乱伦| 欧美午夜精品久久久久久超碰| 久久色激情一区二区三区| 中出789在线视频| 97久久国产亚洲精品超碰热| 少妇天堂| 国产精品又黄又猛又粗| 午夜福利在线合集| 色色色网站| 一及黄久一点| 91在线一起| 91丨人妻丨国产丨丝袜| 久思思热视频在线观看| 黄片在线免费在线观看| 日本熟妇熟色97一本在线观看| 97色97好| 亚洲风情综合网| 激情小说亚洲| 艹少妇网站| 人妻天天夜夜爽一区二区| 欧美老妇女内射网址| 九九九九九九免费视频| 久久只有精品| 在线观看国产黄色| 欧美综合97www| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 国产一区二区三区,在线观看观看 五月开心久久AV官网 | 一级特级aaaa毛片免费观看| 亚洲情色91| 中文子幕一二三| 亚洲综合影院| 黄网在线播放| 黑人精品久久97| 日日爱99| 激情综合婷婷| 青青草字幕AV| 97操| 免费视频a级毛片免费视频| 日夜久久久九九九久| 日韩内| 曰本人妻人人澡人人夹| http://qxhbdz.com| 9997se| AV一区观看| 黄色网址久久精品欧美喷水| 欧亚日本情色| 91午夜无码| 亚洲不卡不卡中文字幕不卡| 南澳成人一级片在线播放| 天天狠操| 女同性恋一区二区三区精品视频| 超碰人人干天天射| 亚洲高清无码在线桃色| 日日橹狠狠爱欧美超碰| 亚洲精品99999| 色婷婷电影网| 黄站在线免费观看| 日日摸夜夜夜夜爽| 亚洲欧洲无码97久久精品| 无码人妻1727| 国内91熟女人妻丝袜天天精品视频在线| 果冻传媒一区二区三区| 26uuu性| 久婷婷一区| 天天上日日上日韩精品| 97精品在线| 亚洲一级性爱视频免费看| 97久久精品国产| 韩国三级一线观看久| 久久久久久久久久久97| 啪啪综合网| 人妻日日夜夜精品| 国产亚洲色停停久久99精品91| 久久啊哟| 高清在线不卡一区二区 视频| 久久久噜噜噜久久久| 91色综合| 精品人妻一区二区免费蜜桃| 欧美熟妇成人一区二区| 男人天堂久久日韩| 久久无码成人| 蜜臀久久99'精品久久久| 伊人女女资源在线观看| 欧美爱国产综合、| 激情九月婷婷| 国产传媒日韩欧美| 欧美亚综合色图| 日韩精品在线视频在线观看| 国产精品电影推荐| 婷婷中文网| 久久伊人影院| 日韩内射视频| 天天躁日日躁xxxxx| 亚洲诱惑天堂 | 成人AV超碰免费在线| AV在线资源| 亚欧高清在线| 久久久久久久久久9| 91女网站| 手机在线视频国内精品| 超碰97人人乐| 国模限制级电影| 人妻丰满熟妇一区二区三| 呦女网站| 九九九九久久久| 精品久久久久久无码| 欧美亚州色的图| 美日韩成人| 91国产操逼视频| 久久久久921| 久久性爱视频| 伊人精品久久网站| 一本大道青青| 中文乱码99| 九九综合久久| 日产操逼| 国产精品午夜精品| 久久久久久久 九九九九九九九| av无线看| 97精品一区二区三区免费| 激情亚洲天堂| 色综合色综合网| 韩三级a视频在线观看| 亚洲欧美国产精品久久久久久久| 99久久无色码| 亚洲经典啪啪| 久久精品国产亚洲AV高清演员表| 国产美女高潮视频| 午夜精品久久久久| 日本在线一二| 亚洲 一区二区 自拍| 国产精品久久| 天天在线91| 大香蕉中文aV在线| 婷婷五月天在线观看| 思思热国产在线视频| 69麻豆天美| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚洲综合网电影91| 欧美性爱1080p| 亚洲综合影院| 久久线上视频免费看| 无码人妻精品一区二区三区九九| 艹我哪美一区无码| 国产欧美亚洲精品a第2页| 成人a v在线播放免费| 男人的天堂99| 无码九九九九| 夜夜人妻爽| 人人操天天爽| 亚洲色图91欧美日韩| 国产一级αv免费看片| 国产不良强奸视频免费看| 久久免费9| 插插综合网天天影视网| 91精品婷婷国产综合久久竹菊| 久草成人福利导航| 久操精品网| 日韩视频啪啪| 污污汅18禁网站在线永久免费观看| 一级性爱网| 天久久久噜噜噜久久国产精品爽爽| 综合性视频99| 是还免费视频1727我| 极品粉嫩少妇视频| 嗯阿好爽好紧| 日本久操视频| 色综合91| 91精品国产综合久久久蜜臀| 五月天激情小说网| 日韩啪啪网| 日韩午夜啪啪视频| 日本午夜福利影院| 精品黑人一区二区| 国产熟女乱论| 日韩欧美亚洲一区二区三区影院| 八人操人人摸人人看| 精品无码不卡视频| 日韩人妻制服丝袜av| 草草影院最新网址| 乱伦a片视频| 亚洲蜜乳av| 在线无码网站| 蜜乳AV一区二区三区四| 亚洲AV无码成人精品久久| av日韩手机在线影视| 中国一区二区亚洲人妻| 插日本熟女视频| 插欧洲美女欧美精品| 日本三级韩三级99久久| 国产一级片| 欧美亚洲综合色| 99自拍B亚洲| 日韩欧美丝袜诱惑| 嗯嗯啊啊好大好爽| 疯操AV| 在线视频资源| 校园春色五月天| 插入逼91| 黄色AAAAA欧美| 日本亚洲熟女视频| 天天插天天干| 激情露脸爱| 九九九精品一区二区无码| 中文字幕精品亚洲熟女| 亚洲性天堂| 91被操| 国产高清MV操逼视频| 破苞ⅩXXX性无码动漫无码| 久久色情| 一区二区三区四区五区高清无码永久视频| 久久视网78| 97在线欧| 亚洲97在线观看| 欧美伊人久久综合网| 首页中文字幕中文字幕免费| 激情五月婷婷综合| 欧美一区二区在线资源| 亚洲色图欧美另类在线| 一本一道久久综合久久| 啊啊啊网站| 亚洲成人无码影院| 91粉芽高清在线一区二区| n1038 一二三区| 欧洲一区二区三区四区在线观看| 中国特猛少妇色xxx| 亚洲黄片免费在线播放| 亚洲精品国产精品乱码不99| 狠狠躁AV| 99蜜月精品久久| 97视频在线免费观看| 国产亚洲日韩在线三区黑人| 亚洲人人操| 欧美78| 久久久久久久97| 久久久久久久国产视频| 亚洲图片欧美91N| 精品视频久久区| 日韩欧美性爱电影在线观看| 粉嫩av在线一区二区| 色呦呦、国产精品| 婷婷探花久久精品一区| 免费家庭乱伦视频| 91久久99久久91熟女精品| 综合网欧| 一起草在线视频| 在线v中文字幕一区二区三区| 午夜福利久久久噜久噜久久综合| 日韩青久久| 一二三四视频中文字幕在线看| 色婷婷五月综合| 久湿久久| 黑人白女精品一区| 校园春色综合| 亚洲精品国产拍免费91在线| 午夜亚洲国产理论秋霞| 2001天天操| 99热精品在线观看| 人人人人插| 东北女人的毛片| 蜜臀99久久精品久久久懂爱| 激情综合网五月婷婷| 综合网97| 国产操伦| 人妻在线大香蕉| 国产操逼网站亚洲一级黄色| 欧美激情综合| 亚洲91射| 国产亚州高清国产拍精| 天天日天天屌天天操| 亚洲国产成人精品久久久国产成人一区二区| 欧美亚洲中文字幕| 欲色啪| 2019天天干天天操| 亚洲免费97免费| 日韩免费中文字幕视频| 国产精品久久久亚洲一区| 超碰久久.com| 午夜男人一级A片7777| 欧美综合在线第一页| 婷婷视频在线免费观看| 亚洲91网站| 少妇无码av专区线| 91网18| 精品日韩中文在线| 久久超碰大香蕉| 亚洲色图尤物视频| 欧美日韩少妇色情| 伊人丁香五月婷婷| 麻豆国产成人精品| 老熟女乱子伦中文字幕一区二区| 人妻人人澡人人爽人人| 久久久精品电影| 久久久久ab| 无码高清国产AV| 精品九九淫乱男| 国产精品久久久久久久黄无码 | 日本精品一区三区| 风月影院十八禁| 精品一区96| 久久这里只精品免费福利| 久久97资源 网| 性爱乱伦视频免费| 天天舔天天日天天射| 欧美性爱视频免费一区一A | 丝袜综合| 黄色区免费观看中文字幕| 国内外毛片在线观看| www.婷婷| 84YTCOM性无码| 日本不卡二三区| 欧美日本中字另类在线| 国产熟码AV| 口爆综合网| 乱伦一二三区| 亚洲综合夜色| 婷色五月| 无码动漫av中文字幕| 18禁久极品美女久久哦哟呀!| 久久久久成人亚洲国产| 精品日日人妻| 偷拍亚洲高清图片| 国产精品久久久无码AV网站| 青草伊人网| 色综合中文字幕不卡| 手机在线A片| 亚洲少妇视频| 熟女中出视频| 国内自拍 日韩激情 99| 国产农村妇女精品| 九九九九欧美| 黄污污污污| 国产av强奸美女| 夜夜夜夜久久久久| 久久久婷婷| 综合五月婷婷| 亚洲一区操| 老熟女天天操| 亚洲永久AV无码精品秋霞| 人妻熟女av国产网站| TS人妖另类精品视频系列| 加勒比人妻综合| 超碰97起碰| 3P乱轮视频| 亚洲色图欧美一区二区不卡| 色欧洲97| 亚洲综合另类欧美久久久| 久久‘黄片视频| AVE乱伦| 久久久一区二区三区麻豆| 加勒比综合九九99视频在线播放| www超碰| 久久精品日韩| 亚洲天堂欧美| 女人天堂网| 天堂国产AV| 六月天婷婷| 国产熟女完整版中字 | 久久久久96| 97色论| 熟女性视频| 秋霞曰韩R级| 岛国在线免费视频| 久久春色| 9久9久| 老女人碰碰在线碰碰视频| 欧美色偷拍 | 天天爽夜夜爽夜夜爽精| 一区二区影视| 偷拍亚洲情色| 亚洲资源网| 中文字日本乱码| 亚洲av在线免费观看| 欧美性爱精品一区二区| 欧美精品一区二区少妇免费A片| 国产三级片在线观看| 久草毛片| 97国产伦理| 嗯嗯,好大,好爽,好骚| 久久精品视频久久久| 99热在线播放| 中文字幕 国产区| 欧美自拍偷拍免费观看| 狠狠中文字幕| 人人操人人摸人人看人人插| 免费a v| 国产精品天堂| 本道综合精品| 日本久久久久久久久久| 公司1区2区3区精产精| 亚洲综合九| 欧美91精彩| ai欧美亚洲小说| 夜夜综合| 99黄页网站| 久久亚洲熟妇在线视频| 99re在线观看| 熟女天天干| 欧美大香蕉97| 国产亚洲色婷婷99精品91| 日少妇亚洲版| 自拍视频大全亚洲专媒视频/一区二区三区| 97日本超碰综合| 亚洲人成色9999精品久久 | 激情综合网五月婷婷五月天| 黄在线| 日韩av一级黄片| 91人妻尻屄视频| 国产免费一区在线观看| 日本在线不卡一二区| a在线观看| 开心激情站| 国产日本熟女顶级一区二区三区视频| 亚洲天堂人妻一区二区| 中文伊人大香蕉视频| 精品国产网站| 人人澡综合涩| 欧美性生活内射| 天天大干大香蕉| 欧美97av| 日本一二区不卡| 亚洲欧美一区二区网址| 91欧美高清| 很黄很污的免费网站| 欧美国产有色电影| 超碰视97中文| 97在线免费视频观看| 日韩在线国产字幕| 中文字幕日韩电影人妻 | 精品一区二区三区麻豆| 久操电影| 亚洲免费成人在线高清无码视频 | 色欲久久久久综合网| 天天谢天天干| 大香蕉免费乱伦视频| 日日日日日| 欧美大香蕉97| 色一区二区三区综合| 欧美人妻制服| 免费看黄片现成| 91精品啪在线观看国产城中村| 五月天精品| 91天天综合网,天天综合网| 精品一区二区久久| 97色在线视频| 婷婷丁香九月| 丁香五月久久| 精品十三区| 97操97干| 五月天我淫我色av| 精品一二三区久久AAA片| 青青草视频久久| 少妇精品久久久| 人妻欧美|