web-dev-qa-db-ja.com

サーバーでジャージのログを取得する方法は?

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)
39
Fakrudeen

サーバー側でロギングをオンにする場合は、 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());
59
Brian Clozel

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);
26
Art

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を使用する必要があります。詳細は 公式ドキュメント にあります

7
lanwen

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>
6
eeezyy

クライアントコードを見せて、リクエストについても教えてください。

この例外は、JAXBの非整列化ステップを指しているようです。どうやら、REST APIからXMLを受け取りましたが、待ち望んでいたものを取得できません。

マーシャリング/アンマーシャリングに使用しているXSDが古いか、単に間違っている可能性があります。
応答から間違ったエンティティを取得しようとしている可能性があります。

次の手順を試して、問題に関する詳細をお知らせください。

応答からXMLを取得します

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);

使用しているXSDでこのXMLを検証します

このテストは失敗するはずです(私が正しい場合)。

3
Brian Clozel