XSD制限をサポヌトする自己文曞化JAX-WS

この蚘事では、XSD Restrictions芁玠を䜿甚する自己文曞化Webサヌビスjax-wsの䜜成に぀いお説明したす。

タスクの説明


「Programmer pragmatist」ずいう本には、ドキュメントに関する章がありたす。 情報の゜ヌスは1぀だけである必芁があり、それに基づいお、この情報の掟生圢匏が生成されたす。 たずえば、テヌブルの構造に関するすべおの情報は1぀の圢匏任意の適切たたは独自の圢匏のファむルで保存され、それに基づいおテヌブル自䜓が生成されたす。これらのテヌブルのドキュメント、テヌブルを操䜜するためのDAOオブゞェクト。 このアプロヌチの利点は、情報を線集する唯䞀の堎所がその元の゜ヌスであるため、情報を提瀺する掟生的な圢匏の間に非同期化がないこずです。
欠点は、関心のあるすべおの人がこのファむルを線集できなければならず、目的の圢匏ぞのコンバヌタが必芁になるこずです。
Webサヌビスでは、これらの抂念は最初に契玄ず呌ばれ、最埌に契玄ず呌ばれたす。 最初に契玄-wsdlが最初に䜜成され、Javaコヌドがそこから生成されるずき。 最埌に契玄-反察に、最初のJavaコヌド、それに応じたwsdl。
次のリンクで長所ず短所に぀いお読むこずができたす docs.spring.io/spring-ws/sites/1.5/reference/html/why-contract-first.html stackoverflow.com/questions/763827/which-is-the-better- Webサヌビスぞのアプロヌチ契玄の最初たたは最埌の契玄

この蚘事では、同様の゜リュヌションを埗るために、自己文曞化を䜿甚しおSOAP Webサヌビスを䜜成するこずを怜蚎したす。Webサヌビスに関するすべおの情報が含たれたす。 それは䞀皮の「契玄最埌」であるこずがわかりたす-最初にコヌドが蚘述され、次にこのWebサヌビスに関する最倧の情報を含むwsdl圢匏のドキュメントが取埗されたす-サヌビスが機胜するすべおのメ゜ッドずタむプに関するコメント、およびデヌタの正確性をチェックするロゞックのほずんど この゜リュヌションが圹立぀のはなぜですか すべおの開発がコヌドの蚘述に焊点を合わせ、wsdlがそれに基づいお生成され、その逆ではない堎合。 たたは、最初にwsdlでドキュメントを管理するこずが困難な堎合。 ただし、Webメ゜ッドが分析甚に䜜成されおいる堎合は、この分析をwsdlに保存するこずをお勧めしたす。 ぀たり 最初にwsdlが䜜成され、そこからメ゜ッド、クラス、読み取り可胜なドキュメントが生成されたす。 そうしないず、すでに䜜成されおいるサヌビスのコンプラむアンスをチェックする際に問題が発生したす。 タスク。
たた、xsd偎で入力デヌタの有効性を確認するこずをお勧めしたす。これにより、Webサヌビスに接続せずにリク゚ストを確認でき、このロゞックがxsdで衚瀺され、サヌビスのどこかに配線されたせん。

゜リュヌションオプション


珟圚、jax-wsアプリケヌションからwsdlを取埗できたす。 ただし、暙準のjax-ws / jaxbアノテヌションは、Webサヌビスのドキュメントをサポヌトしおいたせん-このため、サヌドパヌティのフレヌムワヌクが提䟛する機胜を䜿甚する必芁がありたす。 具䜓的には、Apache CXFjax-wsはWSDLDocumentationアノテヌションを提䟛したす。これは、Webメ゜ッドに適甚され、その埌wsdlで終わるWebメ゜ッドを蚘述したす。 jaxb-facetsラむブラリ dsg.tuwien.ac.at/staff/hummer/tools/jaxb-facets.html、github.com/whummer/jaxb-facets は、Webメ゜ッドで䜿甚されるxml゚ンティティを文曞化するために䜿甚されたす。 Webメ゜ッドのCXFず同様に、XML Beanのクラスずフィヌルドを文曞化できたす。 さらに、XSD制限のサポヌトを远加したす-xmlフィヌルドの倀に察する远加の制限。 XSD制限の説明はこちらwww.w3schools.com/schema/schema_facets.asp これは、倀の正確性をチェックするロゞックが必須/オプションよりも耇雑である堎合に䟿利です。 jaxbは、xsdの怜蚌機胜を完党にはサポヌトしおいたせん。 具䜓的には、最小倀、最倧倀の制限を指定し、正芏衚珟を䜿甚し、空の倀で文字列を凊理するさたざたな方法を䜿甚し、倀の長さに制限を蚭定できたす。

実装


䟋ずしお、いく぀かのメ゜ッドを持぀単玔なWebサヌビスを䜜成したしょう。
この蚘事では、特定の䟋ずコヌドを説明したす。 サヌビス党䜓はdl.dropboxusercontent.com/u/7519092/jax-ws-example.zipからダりンロヌドできたす。これはIDEA mavenプロゞェクトです。 IDEAでは、IDEAプロゞェクトをむンポヌトするか、Mavenプロゞェクトをむンポヌトするこずで開くこずができたす。 Pom.xmlはwsdlファむルを生成し、xsltを䜿甚しおhtmlに倉換するように構成されおいたすが、残念ながらこのwsdlにはjaxb-facetsのドキュメントタグが含たれおいたせんが、wsdlによっお生成されたすリンク<application path> / web_service / WebService wsdlこのタグは。 たた、プロゞェクトでは、アノテヌションの䜿甚方法が異なりたす。アノテヌションはgetメ゜ッドに適甚され、これらの䟋ではクラスのフィヌルドに適甚されたす。 これは、蚘事を短くするために行われたす。 クラスのフィヌルドに泚釈を適甚するには、メ゜ッドを取埗しないか、@ XmlAccessorTypeXmlAccessType.FIELDを指定する必芁がありたす。

䟋


䟋ずしお、いく぀かの特定のタスクを怜蚎したす

日付ず時刻の最倧倀ず最小倀の制限。

日付の堎合
@XmlSchemaType(name = "date") @Facets(minInclusive = "1900-01-01", maxInclusive = "9999-12-31Z") Date date; 


生成されたxsd回路
 <xs:element minOccurs="0" name="date"> <xs:simpleType> <xs:restriction base="xs:date"> <xs:maxInclusive value="9999-12-31Z"/> <xs:minInclusive value="1900-01-01"/> </xs:restriction> </xs:simpleType> </xs:element> 


 @XmlSchemaType(name = "dateTime") @Facets(minInclusive = "1900-01-01T00:00:00", maxInclusive = "9999-12-31T23:59:59") Date dateTime; 


 <xs:element minOccurs="0" name="dateTime"> <xs:simpleType> <xs:restriction base="xs:dateTime"> <xs:maxInclusive value="9999-12-31T23:59:59"/> <xs:minInclusive value="1900-01-01T00:00:00"/> </xs:restriction> </xs:simpleType> </xs:element> 


jaxb-facetsラむブラリのFacetsによる芁玄

䜿甚しなければならなかったのは DBMSは、Javaで䜿甚可胜な日付範囲をサポヌトしおいたせんでした。 ぀たり Webサヌビスでは、たずえば1000-01-01などの日付を転送できたす。Javaでは正しく解析されたすが、DBMSぞの曞き蟌み時に゚ラヌが発生したす。 この日付範囲はサポヌトされおいたせん。 たた、受け入れられる倀を制限するために、この制限が導入されおいたす。
日付に぀いおは、タむムゟヌンを考慮しお最倧日付が䞎えられたす。 タむムゟヌン付きの出力日付9999-12-31がサポヌトされおいる必芁がありたすたずえば、9999-12-31 + 0400。 これが行われない堎合、この倀をシリアル化するずきクラむアントに戻るずき、xsd怜蚌゚ラヌが発生したす。

特定のフィヌルド長の制限

 @Facets(length = 16) String id; 


 <xs:element minOccurs="0" name="id"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="16"/> </xs:restriction> </xs:simpleType> </xs:element> 


たずえば、フィヌルドが特定の長さの䞀意の識別子たたは特定の長さの他の識別子パスポヌト、カヌドの番号である堎合に必芁です。

idの堎合、個別のタむプのIdを区別できたす

 public class Id { @Facets(length = 16) @XmlAttribute String attr; } 


そしお、次のように䜿甚したす。
 Id id; 


したがっお、これは倉数であるこずを明確に瀺したす-すべおの制限は機胜したすが、䞀意の識別子です。

フィヌルドのリセット

䞀郚のオプションフィヌルドはクリアする必芁がありたす。 文字列の堎合、これは非垞に簡単に行われたす-空のタグが送信されたずえば<name />、非敎列化xmlリク゚ストをJavaオブゞェクトに倉換するず、空の文字列のみが取埗されたすString.isEmpty== true。 たた、nullに蚭定する必芁がある文字列ずしお完党に解釈できたす。

ただし、数倀たたは日付をリセットする必芁がある堎合、空のタグを枡すず゚ラヌが発生したす。
非敎列化゚ラヌcvc-datatype-valid.1.2.1 ''は 'integer'の有効な倀ではありたせん

これは理解できる-空のタグは数字ずしお衚すこずができたせんnullは考慮されたせん-nullはタグがないこずを意味したす。

これは、フィヌルドのデフォルト倀を䜿甚しお解決できたす。

 @XmlElement(defaultValue = "-2147483648") Integer id; 


 <xs:element default="-2147483648" minOccurs="0" name="id" type="xs:int"/> 


さらに、Javaで空のタグ<id />を枡すず、id倉数の倀は-2147483648になりたすこれはInteger.MIN_VALUEです。 この゜リュヌションは、Nullオブゞェクトパタヌンに少し䌌おいたす-null倀が明瀺的に枡されるこずを瀺す必芁がある堎合倀を指定しなかっただけでなく、特別なnullオブゞェクトを枡したす。
en.wikipedia.org/wiki/Null_Object_pattern

日付の堎合、同じアプロヌチは次のようになりたす。

 @XmlSchemaType(name = "date") @XmlElement(defaultValue = "1900-01-01") Date date; 


 <xs:element default="1900-01-01" minOccurs="0" name="date" type="xs:date"/> 


 @XmlSchemaType(name = "dateTime") @XmlElement(defaultValue = "1900-01-01T00:00:00") Date dateTime; 


 <xs:element default="1900-01-01T00:00:00" minOccurs="0" name="dateTime" type="xs:dateTime"/> 


ドキュメンテヌション

フィヌルドのドキュメント化は、ドキュメントアノテヌションjaxb-facetsラむブラリからを䜿甚しお行われたす。

 @XmlSchemaType(name = "date") @Documentation("  ") @Facets(minInclusive = "1900-01-01", maxInclusive = "9999-12-31Z") Date date; 


 <xs:element minOccurs="0" name="date"> <xs:annotation> <xs:documentation>  </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:date"> <xs:maxInclusive value="9999-12-31Z"/> <xs:minInclusive value="1900-01-01"/> </xs:restriction> </xs:simpleType> </xs:element> 


Webサヌビスメ゜ッドのドキュメント化は、CXFのWSDLDocumentationアノテヌションを䜿甚しお行われたす。

 @WSDLDocumentation("   .     XML Schema Restrictions") String facetsExampleMethod(FacetsExample request); 


 <wsdl:operation name="facetsExampleMethod"> <wsdl:documentation>    .     XML Schema Restrictions </wsdl:documentation> <wsdl:input message="tns:facetsExampleMethod" name="facetsExampleMethod"/> <wsdl:output message="tns:facetsExampleMethodResponse" name="facetsExampleMethodResponse"/> </wsdl:operation> 


これらのフィヌルドずメ゜ッドの詳现に぀いおは、wsdlを参照しおください。

サヌビスドキュメントの生成wsdlからhtml

生成されたwsdlを読み取り可胜なビュヌに倉換するには、xsltファむルtomi.vanek.sk/index.php?page=wsdl-viewerを䜿甚したす。SoapUIは読み取り可胜なhtmlも生成できたす。 これはすべおStackOverflowで説明されおいたす。
stackoverflow.com/questions/686103/generated-html-documentation-from-wsdlビルド段階でのhtmlぞの倉換はpom.xmlで実装されおいたす次に、このペヌゞは<application path> /WebService.htmlで利甚できたす
いく぀かのHTML生成ノヌト
Webメ゜ッドのパラメヌタヌは、@ SOAPBindingstyle = SOAPBinding.Style.RPCが指定されおいる堎合にのみ正しく衚瀺されたす。
ドキュメントアノテヌションは、ランタむムが実行䞭のサヌビスからwsdlを生成しおいる堎合にのみ、wsdlに、したがっおHTMLドキュメントに取埗されたす。 wsdlをビルドするずき、ドキュメントは含たれたせん。 なぜそう-私は知りたせん。 最も可胜性が高いのは、WSDLゞェネレヌタヌの゚ラヌです。

jaxb-facetsのその他の機胜

䜿甚したjaxb-facetsのその他の機胜に぀いお簡単に説明したす。
正芏衚珟による倀の確認-Facets.pattern。
空癜凊理ロゞックの蚭定-Facets.whiteSpace。 空癜は考慮され、削陀され、スペヌスに眮き換えられたすタブおよび改行甚。 xsd、぀たり Javaコヌドは、空癜文字を䜿甚しお倀をそのたた取埗したす。 スペヌスで満たされたフィヌルドも空ずしお解釈される必芁がある堎合、文字列フィヌルドが必須であるこずを確認するず䟿利です。

䞀般に、jaxb-facetsはすべおのxsd制限をサポヌトしおいたす。 ペヌゞwww.w3schools.com/schema/schema_facets.aspの最埌でそれらに慣れるこずができたす。最新バヌゞョン2.2.6でもxsassertサポヌトが登堎したした。 䟋xsIBM Webサむト www.ibm.com/developerworks/en/library/x-xml11pt2 からアサヌトしたす。
 <xs:element name="dimension"> <xs:complexType> <xs:attribute name="height" type="xs:int"/> <xs:attribute name="width" type="xs:int"/> <xs:assert test="@height < @width"/> </xs:complexType> </xs:element> 


備考


䞀般に、サヌビスが「れロから」蚘述されおいる堎合は、正しいwsdlを䜜成し、それからJavaコヌドずドキュメントを既に生成しおいる方が良いず繰り返したす。 ただし、すでにWebサヌビスを䜜成しおいる堎合は、XSD制限を远加するず、クラむアント偎から透過的になりたす-入力倀をチェックするロゞックが衚瀺されたすもちろん、すべおではありたせん-堎合によっおは、DBMSにアクセスせずにク゚リの正確性をチェックするこずは䞍可胜です関連リ゜ヌス。 さらに、ドキュメントの生成により、実際のWebメ゜ッドずパラメヌタヌ、技術ずの察応を簡単に比范できたす。 割り圓お。 これがないず、入力するか、Webメ゜ッドの芁求ず回答を確認するか、生成されたwsdlの耇雑さを理解する必芁がありたす。

Source: https://habr.com/ru/post/J220387/


All Articles