REST WSにジャージを使用しています。サーバー側でジャージログを有効にするにはどうすればよいですか?
長い話:クライアント側の例外が発生します-しかし、Tomcatのログには何も表示されません[私のメソッドにも到達しません]。スタックトレースは「toReturnValue」と言っているため、サーバーから何かを取得しました。しかし、サーバーが何を言ったかはわかりません。
Exception in thread "main" Java.lang.IllegalArgumentException: source parameter must not be null
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.Java:98)
at com.Sun.xml.internal.ws.message.AbstractMessageImpl.readPayloadAsJAXB(AbstractMessageImpl.Java:100)
**at com.Sun.xml.internal.ws.client.dispatch.JAXBDispatch.toReturnValue(JAXBDispatch.Java:74)**
at com.Sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(DispatchImpl.Java:191)
at com.Sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(DispatchImpl.Java:195)
サーバー側でロギングをオンにする場合は、 LoggingFilter Jerseyフィルター (コンテナー側で)を登録する必要があります。
このフィルターは、要求/応答ヘッダーとエンティティを記録します。
ResourceConfig
クラスに追加する必要があるものは次のとおりです。
@ApplicationPath("/")
public class MyApplication extends ResourceConfig {
public MyApplication() {
// Resources.
packages(MyResource.class.getPackage().getName());
register(LoggingFilter.class);
}
}
同じフィルターがクライアント側でも機能することに注意してください。
Client client = Client.create();
client.addFilter(new LoggingFilter());
Jersey 2ではLoggingFilter
が非推奨になったため、LoggingFeature
を使用する必要があります。クライアントで使用するには、次のスニペットを使用できます。
this.client = ClientBuilder
.newBuilder()
.property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_CLIENT, LoggingFeature.Verbosity.PAYLOAD_ANY)
.property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_CLIENT, "WARNING")
.build();
そしてサーバー側で:
ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
config.register(LoggingFeature.class);
Jersey 2.0ではorg.glassfish.jersey.filter.LoggingFilter
web.xmlを使用して接続できます。
<!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
より多くの説明を見つけることができます here
upd:
バージョンの後2.23LoggingFilter
は非推奨であり、LoggingFeature
を使用する必要があります。詳細は 公式ドキュメント にあります
Jersey 1.2の場合、サーブレットタグ内のweb.xml
に次のエントリを追加します。
<init-param>
<param-name>com.Sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.Sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
クライアントコードを見せて、リクエストについても教えてください。
この例外は、JAXBの非整列化ステップを指しているようです。どうやら、REST APIからXMLを受け取りましたが、待ち望んでいたものを取得できません。
マーシャリング/アンマーシャリングに使用しているXSDが古いか、単に間違っている可能性があります。
応答から間違ったエンティティを取得しようとしている可能性があります。
次の手順を試して、問題に関する詳細をお知らせください。
REST= Client REST simple (a chrome extension)、またはコード:
Builder builder = webResource.path("/yourapi/").accept("application/xml");
// get the client response
ClientResponse response = builder.get(ClientResponse.class);
// log the HTTP Status
logger.log("HTTP Status: " + response.getStatus());
// bypass the jaxb step and get the full response
// MyResource myResource = response.getEntity(MyResource.class);
String myResource = response.getEntity(String.class);
logger.log(myResource);
このテストは失敗するはずです(私が正しい場合)。