ToResponse в джерси ExceptionMapper не вызывается
Итак, я создаю веб-приложение, мы используем JPA и Jersey для потребления/производства данных JSON.
У меня есть обычное "EntityException", а также пользовательский "EntityExceptionMapper"
Здесь mapper:
@Provider
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {
public EntityExceptionMapper() {
System.out.println("Mapper created");
}
@Override
public Response toResponse(EntityException e) {
System.out.println("This doesnt print!");
return Response.serverError().build();
}
}
Мое исключение:
public class EntityException extends Exception implements Serializable{
public EntityException(String message) {
super(message);
System.out.println("This prints...");
}
}
И я вызываю его из вызова REST:
@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String test() throws EntityException{
throw new EntityException("This needs to be send as response!!");
//return "test";
}
Моя проблема в том, что, когда выбрано вышеописанное исключение, я попадаю в конструктор (prints: "This prints..." ) Edit: Я также получаю: "Mapper created!"
Но мой ответ пуст, и я не добираюсь до sys из моего метода toResponse. Это действительно похоже на пример на веб-сайте Джерси:
https://jersey.java.net/nonav/documentation/1.12/jax-rs.html#d4e435
Что мне не хватает?
Ответы
Ответ 1
Я использую модель агностического развертывания, поэтому для меня это работало:
public class MyApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(HelloWorldResource.class);
/** you need to add ExceptionMapper class as well **/
s.add(EntityExceptionMapper.class)
return s;
}
}
Ответ 2
У меня была аналогичная проблема, у которой ExceptionMapper
была правильная аннотация @Provider
, а остальная часть кода была идентична примеру Джерси, но все еще не была зарегистрирована должным образом.
Хорошо, мне пришлось вручную зарегистрировать свой пользовательский ExceptionMapper
в моей HttpServlet
с помощью метода addExceptionMapper
. Поскольку он теперь зарегистрирован вручную, аннотация @Provider
можно безопасно удалить.
Итак, со следующим ExceptionMapper (я улавливаю каждый RuntimeException
, чтобы восстановить их как 400)
public class MyCustomExceptionHandler implements ExceptionMapper<RuntimeException> {
@Override
public Response toResponse(RuntimeException exception) {
return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
}
}
Мне пришлось добавить вторую строку в мой init:
HttpServlet serviceServlet = jerseyServletFactory.create(someResource);
jerseyServletFactory.addExceptionMapper(new MyCustomExceptionHandler()); //<--
httpServer.register(serviceServlet, "/api");
httpServer.start();
Ответ 3
У меня была такая же проблема, и я смог ее исправить, включив пакет моего ExceptionMapper в файл jersey.config.server.provider.packages в моем файле web.xml. Ниже приведен фрагмент из моего web.xml.
<servlet>
<servlet-name>voteride-servlet</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.voteride.ws;com.voteride.errorHandling;org.codehaus.jackson.jaxrs
</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.scanning.recursive</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Ответ 4
Я столкнулся с той же проблемой при разработке образца REST API. При создании REST API я дал базовое имя пакета, например org.manish.rest.message,
Я должен был создать все остальные пакеты под базовым пакетом, как этот
- модель -
org.manish.rest.message.model
- -
org.manish.rest.message.database
- ресурс -
org.manish.rest.message.resource
в файле web.xml init param был указан как
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.manish.rest.message</param-value>
</init-param>
Это означает, что я зарегистрировал базовый пакет в web.xml, какой-нибудь пакет, который я создам под этим; будет рассмотрен JAX-RS на основе моего требования и требования. Но когда я создал свой пакет исключений по ошибке, я ставлю имя пакета org.manish.rest.exception. Поскольку это не было зарегистрировано в web.xml, поэтому мой полный класс исключений не считался обработкой исключения JAX-RS.
В качестве коррекции я только что изменил имя пакета исключений из
org.manish.rest.exception
до org.manish.rest.message.exception
После этого я выполнил один раз в post man и получил ожидаемый результат.
Надеюсь, это может решить ваш запрос.
Спасибо
Маниш
Ответ 5
Я использовал spring для подключения приложения jersey и использовал @Component с @Provider.
Когда я перешел в jersey v > 2.5, он перестал работать.
Я решил эту проблему, добавив @Singleton-аннотацию вместо @Component вместе с @Provider, например:
@Provider
@Singleton
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {...
Ответ 6
Я использую Jersey JdkHttpServerFactory
, и мне просто пришлось добавить класс ExceptionMapper
в качестве ресурса, как и другие ресурсы контроллера:
import com.sun.net.httpserver.HttpServer;
import javax.ws.rs.core.UriBuilder;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
// ...
Set<Class> resources = new HashSet<>();
// Add whatever other resource classes you have...
//--->>> Add the exception mapper <<<---
resources.add(EntityExceptionMapper.class);
ResourceConfig resources = new ResourceConfig(resources);
URI uri = UriBuilder.fromUri("http://localhost/").build();
HttpServer server = JdkHttpServerFactory.createHttpServer(uri, resources);
Ответ 7
Попробуйте зарегистрировать свой класс mapper исключений в файле X extends ResourceConfig.
Регистр (CustomExceptionMapper.class);
эта строка поможет приложению найти ваш класс mapper и вернуть все, что вы написали внутри метода toResponse класса mapper
Ответ 8
Я все еще использую jersey 1.17, spring и jersy- spring
@Компонентная аннотация фиксирует этот
Ответ 9
Я также сталкиваюсь с той же проблемой. Просто добавьте имя пакета, в котором есть классы ExceptionMappperHandler.
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>Service,Utilities.ExceptionMapper</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Здесь служба содержит все классы обслуживания и Utilities.ExceptionMapper содержит все exceptionMapper.
Надеюсь на его помощь
Ответ 10
У меня была та же проблема. Мне просто нужно было изменить web.xml.
Раньше в моем файле param.wml файла web.xml было com.two95.restful.resource
Я просто изменил корневой пакет com.two95.restful
. Затем он начал работать как шарм только с аннотацией @Provider
.
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.two95.restful</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>