2017-01-08 4 views
0

В моей Spring загрузки приложения У меня есть следующий метод: @RestControllerSpring MVC загрузки/Rest контроллер и перечисление десериализации конвертер

@RequestMapping(value = "/{decisionId}/decisions", method = RequestMethod.POST) 
    public List<DecisionResponse> getChildDecisions(@PathVariable Long decisionId, @Valid @RequestBody Direction direction) { 
    } 

я использую перечисления org.springframework.data.domain.Sort.Direction как тела запроса.

В настоящее время внутренняя логика Spring не может десериализовать этот список Direction после запроса от клиента.

Не могли бы вы показать, как написать пользовательский конвертер enum (или что-то в этом роде) и настроить его с помощью Spring Boot, чтобы иметь возможность десериализовать Direction перечисление из запроса клиента? Также должно быть допустимо значение null.

+0

Не могли бы вы опубликовать пример сообщения с запросом? – chaoluo

ответ

1

Прежде всего, вы должны создать пользовательский класс конвертер, который реализует интерфейс HttpMessageConverter<T>:

package com.somepackage; 

public class DirectionConverter implements HttpMessageConverter<Sort.Direction> { 

    public boolean canRead(Class<?> aClass, MediaType mediaType) { 
     return aClass== Sort.Direction.class; 
    } 

    public boolean canWrite(Class<?> aClass, MediaType mediaType) { 
     return false; 
    } 

    public List<MediaType> getSupportedMediaTypes() { 
     return new LinkedList<MediaType>(); 
    } 

    public Sort.Direction read(Class<? extends Sort.Direction> aClass, 
           HttpInputMessage httpInputMessage) 
           throws IOException, HttpMessageNotReadableException { 

     String string = IOUtils.toString(httpInputMessage.getBody(), "UTF-8"); 
     //here do any convertions and return result 
    } 

    public void write(Sort.Direction value, MediaType mediaType, 
         HttpOutputMessage httpOutputMessage) 
         throws IOException, HttpMessageNotWritableException { 

    } 

} 

я использовал IOUtils из Apache Commons IO для новообращенного InputStream в String. Но вы можете сделать это любым предпочтительным способом.

Теперь у вас зарегистрирован созданный конвертер в списке преобразователей пружин. Добавить в <mvc:annotation-driven> теге следующий:

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="com.somepackage.DirectionConverter"/> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

Или, если вы используете Java конфигурации:

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(
     List<HttpMessageConverter<?>> converters) {  
     messageConverters.add(new DirectionConverter()); 
     super.configureMessageConverters(converters); 
    } 
} 
Смежные вопросы