Java 1.6を使用wsimport
WebサービスのWSDLからソースを生成しました。要求構造内のフィールドの1つは、WSDLに含まれるXMLスキーマにタイプxs:dateTime
を持ち、生成コードにjavax.xml.datatype.XMLGregorianCalendar
と入力します。XMLGregorianCalendarの日付が空の文字列にシリアライズ
soapUIによる手動テストでは、次のシリアル化された値がWebサービスで受け入れられることが確認されています。2011-12-08
、2011-12-08Z
以下は受け入れられず、この場合の応答は空の応答(明示的なエラーではない)です:2011-12-08T20:00:00
、2011-12-08T20:00:00-05:00
。その場合、サービス自体は.NETで動作します。
私の考えでは、サーバーは完全な日付/時刻を受け入れ、日付のみを拒否する必要がありますが、それ以外の方法は何が起こっているかです。しかし、私は、サーバーの保守担当者が変更に対応することを前提としていません。だから私はクライアントに日付を送るように説得しようとしました。
XMLGregorianCalendar
オブジェクトを日付にのみシリアル化するようにクライアントコードを納得させることはできません。実際には、私ができるのはを除いて生成されたコードです。生成されたクライアントコード(wsimport
によって生成される)がそれを行うとき、シリアライズされた値は空の文字列であり、サーバーはエラーを正しく返します。私はこれをパケットスニファを使って検証しました。ここで
は、私がリクエストで日付フィールドを作成し、移入しています方法です:
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.TimeZone;
// also import GeneratedRequest from generated packages
private makeRequest() {
GeneratedRequest request;
// ...
request.setDateField(xmlDayNow(TimeZone.getTimeZone("America/New_York"),
6)); // broadcast day starts at 6 am EST
// ...
}
@XmlSchemaType(name="date")
private static XMLGregorianCalendar xmlDayNow(TimeZone tz, int localHourStart)
throws MyException {
GregorianCalendar cal = gregorianBroadcastDayNow(tz, localHourStart);
XMLGregorianCalendar result;
try {
result = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(
cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1,
cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED)
.normalize();
} catch (DatatypeConfigurationException e) {
throw new MyException("XMLGregorianCalendar issue", e);
}
return result;
}
protected static GregorianCalendar gregorianBroadcastDayNow(TimeZone tz,
int localHourStart) {
GregorianCalendar now = new GregorianCalendar(tz);
if (now.get(GregorianCalendar.HOUR_OF_DAY) < localHourStart) {
now.add(GregorianCalendar.DAY_OF_MONTH, -1);
}
return now;
}
私の場合でたXMLGregorianCalendarの実装クラスがcom.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl
です。デバッガで、またはログ出力を追加すると、日付オブジェクトのtoXMLFormat()
メソッドを呼び出すと、2011-12-09
などの日付のみが返されます。デバッガを使用して日付オブジェクト自体を検査すると、そのフィールドのまたは,day
およびmonth
のフィールドが入力され、その他はnull
または-2147483648
の値がDatatypeConstants.FIELD_UNDEFINED
であることがわかります。私が見つけたすべてのドキュメントとインターネット検索結果によると、私の日付オブジェクトは正しく形成されています。
私はクレイジーですか?サーバーに実際にエラーがありますか?生成されたクライアントコードの拒否は正しい日付だけを送信するのですか?これは正当な "未定義の行動"のケースですか?誤った実装クラスが使用されていますか(とにかく問題になる可能性があります)?私に影響を与えるwsimport
に関する既知の問題がありますか?
でしたあなたはGeneratedRequestクラスのリストとXMLスキーマを提供していますか? – korifey