2015-01-16 20 views
6

dịch vụ Spring Boot + Jersey REST của tôi không hoạt động như mong đợi.Jersey ExceptionMapper không ánh xạ ngoại lệ

EmailExistsException được ném trong UserController nhưng tôi chỉ nhận được lỗi 500. Tất cả thời gian. Và ngoại lệ của tôi không được ghi lại.

Tôi nghi ngờ có một số vấn đề về cấu hình với xử lý ngoại lệ nhưng không biết phải thiết lập ở đâu. Bất kỳ đề xuất?

@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' 

Trả lời

15

trả lời rằng giải quyết vấn đề của tôi:

Tôi đã đặt gói ("package.name"); đó là tên gói gốc và người lập bản đồ ngoại lệ của tôi hoạt động như một sự quyến rũ.

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

không có thông tin về cấu hình này trong tài liệu [jersey] (https://jersey.java.net/documentation/latest/representations.html#d0e6653). Tuyên bố 'gói' có tránh bạn khai báo các bộ điều khiển không? – herau

+0

Tôi đã tìm thấy nó trong một số đoạn mã trên internet. Tôi đang ở Scala bây giờ nên không thể cho bạn biết thêm thông tin về nó. – Reeebuuk

+3

Cảm ơn! Nó chỉ ra bạn phải hoặc là 'đăng ký (YourExceptionMapper.class)' hoặc đặt nó trong một gói được quét qua 'gói (" YourExceptionMapperPackage ")'. Tôi đã dành vài giờ cố gắng tìm ra điều này trước khi tôi tìm thấy câu trả lời của bạn. –

1

Bạn đã cấu hình tùy chỉnh ExceptionMapper như một nhà cung cấp jax-rs, và Bạn có s ure rằng ngoại lệ của bạn là nhận được gói vào EmailExistsException? Bạn có thể phải xem bài đăng này.

JAX-RS using exception mappers

+0

Nó có một chú giải @Provider và có, tôi chắc chắn rằng nó được gói và ném. Một điều nữa là khi tôi cố gắng để đặt breakpoint trong EmailExistsExceptionMapper nó không còn sống trong IDEA trong chế độ gỡ lỗi. Có vẻ như bằng cách nào đó nó không được sử dụng? Một số cấu hình bị thiếu có thể nhưng ở đâu? – Reeebuuk

0

tôi đã cùng một vấn đề

tôi chỉ đề cập đến gói rễ vào file web.xml trong <param-value> thẻ của <init-param>

Sau đó, Nó bắt đầu làm việc như quyến rũ

<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> 
Các vấn đề liên quan