2015-01-16 2 views
6

Моя служба Spring Boot + Jersey REST не работает должным образом.Jersey ExceptionMapper не отображает исключения

EmailExistsException выбрасывается в UserController, но я получаю только ошибку 500. Все время. И мои исключения не регистрируются.

Я подозреваю, что есть некоторая проблема с конфигурацией при обработке исключений, но не знаю, где ее настроить. Какие-либо предложения?

@POST 
@Path("register") 
@Produces(MediaType.APPLICATION_JSON) 
public Response register(NewUserPayload newUserPayload) throws EmailExistsException, MessagingException 

EmailExistsExceptionMapper

@Provider 
public class EmailExistsExceptionMapper extends AbstractExceptionMapper  implements 
    ExceptionMapper<EmailExistsException> 
{ 
@Override 
public Response toResponse(EmailExistsException e) 
{ 
    ResponseEntity re = new ResponseEntity(org.springframework.http.HttpStatus.BAD_REQUEST); 

    return this.errorResponse(HttpStatus.BAD_REQUEST_400, re, e); 
} 
} 

AbstractExceptionMapper

@Slf4j 
public abstract class AbstractExceptionMapper 
{ 
protected Response errorResponse(int status, ResponseEntity responseEntity, Throwable t) 
{ 
    StringWriter sw = new StringWriter(); 
    PrintWriter pw = new PrintWriter(sw); 
    t.printStackTrace(pw); 
    log.error(sw.toString()); // logging stack trace. 

    return customizeResponse(status, responseEntity); 
} 

private Response customizeResponse(int status, ResponseEntity responseEntity) 
{ 
    return Response.status(status).entity(responseEntity).build(); 
} 
} 

build.gradle

compile("org.springframework.boot:spring-boot-starter-web") { 
    exclude module: 'spring-boot-starter-tomcat' 
} 
compile "org.springframework.boot:spring-boot-starter-jetty" 
compile "org.springframework.boot:spring-boot-starter-security" 
compile "org.springframework.boot:spring-boot-starter-aop" 
compile "org.springframework.boot:spring-boot-starter-data-jpa" 
compile "org.springframework.boot:spring-boot-starter-thymeleaf" 
compile "org.springframework.boot:spring-boot-starter-jersey" 
compile 'org.springframework.boot:spring-boot-starter-mail' 

ответ

15

Ответ, который решил мои проблемы:

Я положил пакеты ("package.name"); который является именем моего корневого пакета и маркерами исключений, работают как шарм.

@Component 
@ApplicationPath("/api") 
public class JerseyConfig extends ResourceConfig 
{ 
public JerseyConfig() 
{ 
    packages("package.name"); 
    register(UserController.class); 
    register(TimezoneController.class); 
} 
} 
+0

Информация об этой конфигурации отсутствует в [jersey documentation] (https://jersey.java.net/documentation/latest/representations.html#d0e6653). Препятствует ли объявление 'package' объявлять контроллеры? – herau

+0

Я нашел его в некоторых фрагментах кода в Интернете. Я сейчас в Скала, поэтому не мог рассказать вам больше об этом. – Reeebuuk

+3

Спасибо! Оказывается, вам нужно либо явно «зарегистрировать (YourExceptionMapper.class)», либо поместить его в сканированный пакет через «пакеты (« YourExceptionMapperPackage »)». Я провел пару часов, пытаясь понять это, прежде чем я нашел ваш ответ. –

1

Вы настроены пользовательские ExceptionMapper в качестве поставщика JAX-RS, и Вы S что ваше исключение обернуто в EmailExistsException? Возможно, вам придется посмотреть этот пост.

JAX-RS using exception mappers

+0

It имеет аннотацию @Provider и да, я уверен, что она обернута и брошена. Другое дело, что когда я пытаюсь поставить точку останова в EmailExistsExceptionMapper, она не жива в IDEA в режиме отладки. Кажется, что-то он не используется? Некоторая конфигурация отсутствует, но где? – Reeebuuk

0

У меня была такая же проблема

я только что упомянул корневой пакет на файл web.xml в <param-value> теге <init-param>

Затем он начал работать как шарм

<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> 
Смежные вопросы