Ich muss Jersey 1.19 mit Jersey-Test-Framework-Grizzly2 testen. Es gibt Konfigurationsklasse mit registrierten REST-Endpunkt und Ausnahme-Mapper-Klasse:Jersey Test - ExceptionMapper - UniformInterfaceException wenn der HTTP-Status nicht 200 ist
public class ConfiguredMyServiceTest extends JerseyTest {
@Override
protected int getPort(int defaultPort) {
return 8080;
}
public static class AppConfig extends DefaultResourceConfig {
public AppConfig() {
getSingletons().add(new ExceptionMapperProvider());
getSingletons().add(new MyService());
}
}
@Override
public WebAppDescriptor configure() {
return new WebAppDescriptor.Builder()
.initParam(WebComponent.RESOURCE_CONFIG_CLASS,
AppConfig.class.getName())
.build();
}
}
Wenn ich ausführen/Test-REST-Endpunkt, den HTTP-Status 200 zurück, es funktioniert gut.
Wenn Ausnahme ausgelöst wird, Ausnahme Mapper behandelt sie gut und Formen zurückgeben Objekt javax.ws.rs.core.Response mit Fehlercode:
@Provider
@Singleton
public class ExceptionMapperProvider implements ExceptionMapper<Exception>{
@Override
public Response toResponse(final Exception exception){
return Response.status(HttpStatusCodes.STATUS_CODE_SERVER_ERROR).entity(new BasicResponse(InternalStatus.UNHANDLED_EXCEPTION, exception.getMessage())).type(MediaType.APPLICATION_JSON).build();
}
}
Allerdings bekomme ich
com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/v1/my-service/ returned a response status of 401 Unauthorized
wenn Ich versuche die Antwort in meinen JUnit-Tests zu bestätigen. Wie bekomme ich eine wohlgeformte Antwort anstelle von UniformInterfaceException?
Haben Sie irgendwelche Authentifizierungshandler vorhanden, weil 401 bedeutet, dass Sie sich nicht authentifizieren können? Ich weiß zwar nicht, was Ihre Konstante STATUS_CODE_SERVER_ERROR auswertet. Ist das eigentlich ein 401? –
STATUS_CODE_SERVER_ERROR bedeutet 500. Ich habe ExceptionMapper für SO so vereinfacht, dass einige Teile entfernt wurden. Es ist jedoch egal, ob es 401, 500 oder ein anderer Fehlercode ist, das Problem ist das gleiche - wenn ich es teste, bekomme ich UniformInterfaceException statt Response. – Justas
Ich würde empfehlen, Protokollierungsfilter zu aktivieren, so dass Sie die Anfrage/Antwort sehen können. Überprüfen Sie hier, ob Sie es noch nie benutzt haben. Sehen Sie, dass die Anfrage Ihren Restdienst betrifft? Hier finden Sie ein Beispiel für das Aktivieren des Protokollierungsfilters auf der Clientseite. http://stackoverflow.com/questions/2332515/how-to-get-jersey-logs-at-server Sie können auch die boolesche Eigenschaft im LoggingFilter-Konstruktor auf true setzen. Dies stellt sicher, dass der 401 tatsächlich vom Server kommt und kein Problem mit der Client-Konfiguration ist. –