wake-up-neo.com

Interner HTTP 500-Server Fehler in einfach REST basiertes Programm. Verwirrt in GET und POST beim Empfangen/Senden einer Antwort vom Server

Ich implementiere zum ersten Mal eine grundlegende Client-Server-Architektur mit REST - Diensten. Diesmal habe ich es komplizierter gemacht, einige Klassen und Dienste hinzuzufügen, die Klassenobjekte als Parameter zwischen Client und Server freigeben. Ich verwende Server auf ApacheTomcat7. Es wird erfolgreich ausgeführt. Wenn ich meinen Client betreibe, wird mir eine Fehlermeldung angezeigt: javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error Ich habe versucht, meinen Code zu debuggen. Es scheint, als würde ich nicht richtig eine Antwort empfangen/senden. Ich weiß, dass es nicht klug ist, alle Klassen hier zu teilen, aber ich habe keine Wahl, da es meine Zeit sehr verschwendet hat. Jede Hilfe wird geschätzt. Danke im Voraus. 

Folgendes ist meine ImageProgress-Klasse. Diese Klasse ist sowohl auf dem Server als auch auf dem Client vorhanden.

@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 ist die Klasse, deren Objekt als Serverantwort an den Client zurückgegeben wird. HPCResponse gibt grundsätzlich das ImageProgress-Objekt zurück, das das beabsichtigte Ergebnis liefert.

@XmlRootElement
public class HPCResponse
{
    private ImageProgress imgProgress;

    public ImageProgress getImgProgress() {
        return imgProgress;
    }

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

Es folgt die Serviceklasse des Servers mit dem Namen HpcService, die das Objekt der HPCResponse als Antwort zurückgibt. Wie Sie sehen, akzeptiert die Methode startAnalysing ein Objekt von HPCInfo. Die Beschreibung von HPCInfo ist ebenfalls unten angegeben.

@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;
    }
}

Die HPCInfo-Klasse befindet sich auch auf Client und Server. HPCInfo-Klasse:

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

        public String getImagePath(){
            return imagePath;
        }

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

Und schließlich ist es mein Kunde, der nach dem HPCService ruft.

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

Dies ist die vollständige Fehlerbeschreibung, die ich erhalte:

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)
12
sandeep.ganage

Eine Möglichkeit, solche Dinge zu debuggen, besteht darin, eine einfache ExceptionMapper zu erstellen, um Ausnahmen abzufangen, die nicht zugeordnet sind. Wenn kein Mapper vorhanden ist, sprudelt die Ausnahme oft bis zur Containerebene, was uns einen generischen 500-Serverfehler (der meistens wenig hilfreich ist) gibt.

@Provider
public class DebugExceptionMapper implements ExceptionMapper<Exception> {

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

Dann registrieren Sie einfach den Mapper. Wenn Sie einen einfachen Test mit Ihrer ImageProgress-Klasse ausführen und die Ausnahme ausgelöst wird, wird der Stacktrace gedruckt und Sie können die Ausnahmemeldung sehen

... ImageProgress hat keinen Standardkonstruktor no-arg

Fügen Sie der ImageProgress-Klasse einfach einen Standardkonstruktor (no-arg-Konstruktor) hinzu. Dies ist bei den JAXB-Modellen erforderlich.

18
Paul Samsotha

Fügen Sie diese Codezeile vor class HPCResponse ein:

@XmlAccessorType(XmlAccessType.FIELD)
0
Daya sreenivas