web-dev-qa-db-ja.com

単純なRESTベースのプログラムでHTTP 500内部サーバーエラー。GETとPOSTサーバーからの応答の受信/送信中に混乱

RESTサービスを使用して、基本的なクライアントサーバーアーキテクチャを初めて実装します。 ApacheTomcat7でサーバーを実行していますが、正常に実行されています。クライアントを実行しているときにエラーが発生しています:javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Errorコードをデバッグしようとしましたが、適切に応答を受信/送信していないようです。ここですべてのクラスを共有することは賢明ではありませんが、多くの時間を無駄にしているため選択の余地はありません。任意の助けをいただければ幸いです。前もって感謝します。

以下は私のImageProgressクラスです。このクラスは、サーバーとクライアントの両方に存在します。

@XmlRootElement
public class ImageProgress{
    private String name;

    public ImageProgress( String image_name){
        this.name = image_name;
    }

    public String getName() {
        return name;
    }

    public void setName( String name ){
        this.name = name;
    }
}

HPCResponseは、オブジェクトがサーバーの応答としてクライアントに返されるクラスです。 HPCResponseは基本的にImageProgressオブジェクトを返し、意図した結果が得られます。

@XmlRootElement
public class HPCResponse
{
    private ImageProgress imgProgress;

    public ImageProgress getImgProgress() {
        return imgProgress;
    }

    public void setImgProgress(ImageProgress imgProgress) {
        this.imgProgress = imgProgress;
    }
}

以下は、HpcResponseのオブジェクトを応答として返すHpcServiceというサーバーのサービスクラスです。ご覧のとおり、startAnalysingメソッドはHPCInfoのオブジェクトを受け入れます。 HPCInfoの説明も以下に示します。

@Path( "/hpc" )
@Consumes( MediaType.APPLICATION_XML )
@Produces( MediaType.APPLICATION_XML )
public class HpcService{

    public HPCInfo hpcInfo;
    public HPCResponse hpcResponse;

    @POST
    @Path( "/analyze" )
    public HPCResponse startAnalysing(HPCInfo _hpcInfo){

        System.out.println( "Started Analyzing..." );

        hpcInfo = _hpcInfo;
        hpcInfo.getImagePath();        

        hpcResponse = new HPCResponse();
        ImageProgress iProg = new ImageProgress(hpcInfo.getImagePath());
        hpcResponse.setImgProgress(iProg);

        System.out.println("Returning response...");
        return hpcResponse;
    }
}

HPCInfoクラスもクライアントとサーバーの両方にあります。 HPCInfoクラス:

    @XmlRootElement
    public class HPCInfo
    {
        private String imagePath = "";

        public String getImagePath(){
            return imagePath;
        }

        public void setImagePath( String imagePath ){
            this.imagePath = imagePath;
        }
    }

そして最後に、クライアントがHPCServiceを呼び出します。

public class TestClient {
    private static String webServiceURI = "http://localhost:8080/TestServer123";
    public static void main(String[] args) {
        String input = "ABNKidney.scn";
        ClientConfig clientConfig = new ClientConfig();
        Client client = ClientBuilder.newClient(clientConfig);
        URI serviceURI = UriBuilder.fromUri(webServiceURI).build();

        WebTarget webTarget = client.target(serviceURI);

        HPCInfo info = new HPCInfo();
        info.setImagePath(input);

        webTarget = webTarget.path("test").path("hpc").path("analyze");

        HPCResponse hResponse = webTarget.request().accept(MediaType.APPLICATION_XML).post(Entity.entity(info, MediaType.APPLICATION_XML), HPCResponse.class);
    }
}

これは私が得ている完全なエラーの説明です:

javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.Java:968)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.Java:795)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.Java:91)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.Java:683)
    at org.glassfish.jersey.internal.Errors.process(Errors.Java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.Java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.Java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.Java:424)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.Java:679)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.Java:435)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.Java:338)
    at com.TestClient.main(TestClient.Java:34)
13
sandeep.ganage

このようなことをデバッグする1つの方法は、単純なExceptionMapperを作成して、マッピングされていない例外をキャッチすることです。マッパーがない場合、多くの場合、例外がコンテナレベルにバブルアップし、一般的な500サーバーエラーが発生します(ほとんどの場合、ほとんど役に立ちません)。

@Provider
public class DebugExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public Response toResponse(Exception exception) {
        exception.printStackTrace();
        return Response.serverError().entity(exception.getMessage()).build();
    } 
}

次に、マッパーを登録します。 ImageProgressクラスを使用して簡単なテストを実行すると、例外がスローされたときにスタックトレースが出力され、例外メッセージが表示されます

... ImageProgressには引数なしのデフォルトコンストラクタはありません

したがって、デフォルトの(引数なしのコンストラクター)をImageProgressクラスに追加するだけです。これはJAXBモデルの要件です。

20
Paul Samsotha

class HPCResponseの前に次のコード行を追加します。

@XmlAccessorType(XmlAccessType.FIELD)
0
Daya sreenivas