2016-04-09 20 views
6

Tôi mới sử dụng Spring Boot. Trong Bộ điều khiển của tôi, tôi đang sử dụng UUID s làm @PathVariable. Theo mặc định, spring return MethodArgumentTypeMismatchException khi chuyển một số không hợp lệ UUID.công cụ chuyển đổi tùy chỉnh không được đăng ký trong khởi động mùa xuân

Khi khách hàng chuyển số UUID không hợp lệ, tôi muốn ném InvalidUUIDException tùy chỉnh, để tôi có thể trả lại ErrorDto tùy chỉnh bằng cách sử dụng Ngoại lệ này.

Để lưu ý rằng tôi đang cố gắng đăng ký tùy chỉnh UUIDConverter (triển khai org.springframework.core.convert.converter.Converter).

@Component 
public class UUIDConverter implements Converter<String, UUID> 
{ 
    private static final Pattern pattern = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}"); 

    @Override 
    public UUID convert(String input) throws InvalidUuidException 
    { 
     if (!pattern.matcher(input).matches()) { 
      throw new InvalidUuidException(input); 
     } 

     return UUID.fromString(input); 
    } 
} 

Để đăng ký thành phần này, tôi thêm bộ chuyển đổi này vào lò xo ConversionService. Sử dụng ConversionServiceFactoryBean.

@Configuration 
public class ConversionServiceConfiguration 
{ 
    @Bean 
    public ConversionServiceFactoryBean conversionService() 
    { 
     ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean(); 
     bean.setConverters(getConverters()); 

     return bean; 
    } 

    private Set<Converter> getConverters() 
    { 
     Set<Converter> converters = new HashSet<>(); 
     converters.add(new UUIDConverter()); 

     return converters; 
    } 
} 

Tôi cũng cố gắng sử dụng @Component thay vì @Configuration như nó đã được đề cập ở đây: Spring not using mongo custom converters

giải pháp khác tôi đã cố gắng ra: Đặt tên đậu conversionServiceFactoryBean thay vì conversionService. Hoặc gọi bean.afterPropertiesSet() và retuning một ConversionService sử dụng bean.getObject() ...

Tôi cũng đã cố gắng để mở rộng từ WebMvcConfigurerAdapter, trọng addFormatters và thêm chuyển đổi của tôi có sử dụng addConverter ...

Như đã đề cập ở đây: Tôi đã How to register custom converters in spring boot? cũng đã cố gắng đăng ký bộ chuyển đổi dưới dạng trực tiếp @Bean.

Không quan trọng những gì tôi đã thử, UUIDConverter sẽ không được áp dụng.

Giải pháp chính xác làm gì đó giống như thế nào trong khởi động mùa xuân?
Có ai có thể giúp đỡ ở đây không? Tôi đang làm gì sai?

+0

Tôi có cùng sự cố chính xác – wasabi

+0

bạn đã bật SprinbWebMvc chưa? – hovanessyan

Trả lời

0

Cách thành ngữ trong Spring để xử lý trường hợp này là sử dụng tùy chỉnh ExceptionHandler. Về cơ bản bạn đang nói với Spring rằng bạn sẽ xử lý lớp lỗi cụ thể này.

Ý tưởng là bạn xác định ExceptionHandler, mà chặn các lỗi ném (ví dụ MethodArgumentTypeMismatchException) và trả về một tùy chỉnh ResponseEntity dân cư với bất cứ cấu trúc (ví dụ ErrorDto) bạn cần, mã lỗi, tiêu đề, vv

Dưới đây là một Ví dụ:

@ExceptionHandler({ MethodArgumentTypeMismatchException.class }) 
public ResponseEntity<Object> handleMethodArgumentTypeMismatch(
    MethodArgumentTypeMismatchException ex, WebRequest request) { 

    //populate your ErrorDto with the desired information 
    ErrorDto errorDto = 
     new ErrorDto(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), ex); 

    //return your ErrorDto wrapped in ResponseEntity 
    return new ResponseEntity<Object>(errorDto, HttpStatus.BAD_REQUEST); 
} 

CẬP NHẬT

tôi đã thực sự có thể chạy một mẫu mã fe trong quá trình chuyển đổi tùy chỉnh của bạn, nhưng điều xảy ra là, ngoại lệ bạn ném được gói trong ConversionFailedException, sau đó trong TypeMismatchException và cuối cùng là MethodArgumentTypeMismatchException và đây là những gì được trả lại cho khách hàng. Vì vậy, ngay cả khi bạn quản lý để chạy nó với bộ chuyển đổi tùy chỉnh, có thêm công việc để tuyên truyền ngoại lệ của bạn cho khách hàng và không được gói trong MethodArgumentTypeMismatchException.

+0

Xin lỗi mã này không liên quan đến vấn đề này. Ngoại lệ ** xử lý ** hoạt động tốt .. Vấn đề ở đây là để ném một ** ngoại lệ tùy chỉnh ** để nói cho khách hàng một cách rõ ràng UUID là phần không hợp lệ trong yêu cầu bằng cách sử dụng chuyển đổi khởi động mùa xuân. Về cập nhật của bạn: Đây là những gì bạn có thể tránh bằng cách sử dụng ngoại lệ tùy chỉnh – Tim

+0

Bạn đã thực sự gỡ lỗi mã của mình để xem liệu phương thức chuyển đổi chuyển đổi có đang được gọi không? – hovanessyan

+0

Với ExceptionHandler, bạn vẫn có thể gửi cho khách hàng bất cứ thông tin nào bạn muốn. Theo như tôi nhận được nó ứng dụng của bạn sẽ gửi lại JSON, do đó, nó không quan trọng nếu bạn sẽ xây dựng JSON từ này hoặc ngoại lệ đó hoặc từ việc sử dụng một số lớp khác. Thông thường trong REST trạng thái lỗi được chỉ ra thông qua các mã trạng thái HTTP, mà bạn có thể thiết lập bằng cách sử dụng ExceptionHandler. – hovanessyan

1

Tôi chỉ biết về vấn đề này bởi vì tôi đã làm điều tương tự bản thân mình với một lớp và ngồi hàng giờ liền gỡ lỗi ...

Các UUIDConverter là một bean already a registered by Spring itself. Chọn nghĩa đen bất kỳ tên nào khác và bạn sẽ thấy nó xuất hiện.

+0

Huh, cần phải thử điều đó. Trong trường hợp đó tôi mong đợi ngoại lệ NoUniqueBean hoặc một cái gì đó tương tự:/Cảm ơn gợi ý của bạn! – Tim

Các vấn đề liên quan