2015-05-05 3 views
1

У меня есть мой контроллер следующим образом. RelationType - это поле в Table класс. Я получил следующее исключение. Есть идеи?Не удалось прочитать JSON

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not construct instance of com.mycompany.myapp.core.domain.RelationType from String value 'unionetomany': value not one of declared Enum instance names: [unionetoone, unionetomany] 
at [Source: [email protected]; line: 1, column: 435] (through reference chain: com.mycompany.myapp.core.domain.Table["relations"]->com.mycompany.myapp.core.domain.Relation["relationtype"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of com.mycompany.myapp.core.domain.RelationType from String value 'unionetomany': value not one of declared Enum instance names: [unionetoone, unionetomany, unimanytoone, unimanytomany, bionetoone, bionetomany, bimanytoone, bimanytomany] 
at [Source: [email protected]; line: 1, column: 435] (through reference chain: com.mycompany.myapp.core.domain.Table["relations"]->com.mycompany.myapp.core.domain.Relation["relationtype"]) 
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228) 
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220) 
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:138) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:183) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:98) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79) 

@RequestMapping(method = RequestMethod.POST) 
    public void validateSchema(@RequestBody Table[] tables, HttpServletRequest request) { 
    ...... 
} 

public enum RelationType { 
    UNI_ONE_TO_ONE("unionetoone"), 
    UNI_ONE_TO_MANY("unionetomany"); 

    private final String text; 

    private RelationType(final String text) { 
     this.text = text; 
    } 

    @Override 
    public String toString() { 
     return text; 
    } 
} 

ответ

2

По умолчанию Enum ы name используется для сериализации, а не то, что toString() возвращается. Поэтому, пока сообщение об ошибке запутывает (оно должно отображать ожидаемые фактические значения), проблема в том, что он ожидает UNI_ONE_TO_MANY.

Если вы хотите использовать значение, возвращенное toString(), вы должны иметь возможность добавлять аннотации к @JsonValuetoString() методу, и что следует указать, что значение должно быть использовано для сериализации.

Альтернативой является включение DeserializationFeature.READ_ENUMS_USING_TO_STRING, которое изменит поведение в глобальном масштабе.

Смежные вопросы