2016-11-03 2 views
0

Я делаю проект Spring Rest Api с весны 4.xSpring @Requestbody не отображение на внутренний класс

Это Работает:

Controller.java

@PostMapping("newTransaction") 
TransactionRequestModel insertNewTransaction(@RequestBody TransactionRequestModel model){ 
    //do something 
} 

TransactionRequestModel .java

public class TransactionRequestModel { 
    private int id; 
    private List<KeyValue> keyValueList; 
    public TransactionRequestModel(){} 
    //default constructor 
    //getter-setter 
} 

KeyValue.java

public class KeyValue { 

    String key; 
    String value; 
    //default constructor 
    //setter-getter 
} 

Запрос Body Json

{ 
    "id": 1 
    "keyValueList": [ 
    { 
     "key": "dummy", 
     "value": "dummy" 
    } 
    ] 
} 

конвертер Spring сообщение с помощью Джексоном работает нормально.

Это не будет:

Когда я изменить TransactionRequestModel.java к следующему (и удалить KeyValue.java)

public class TransactionRequestModel { 

    public class KeyValue {  
     String key; 
     String value; 
     //default constructor 
     //setter-getter 
    } 
    private int id; 
    private List<KeyValue> keyValueList; 
    public TransactionRequestModel(){} 
    //default constructor 
    //getter-setter 
} 

средства, делая KeyValueвнутренний класс, получил следующую ошибку.

org.springframework.http.converter.HttpMessageNotReadableException: не удалось прочитать документ: Нет подходящий конструктор найден для типа [простой тип, класс com.example.model.TransactionRequestModel $ KeyValue]: не может Instantiate из объекта JSON (отсутствует конструктор по умолчанию или творца, или, возможно, необходимо добавить/включить информацию о типе?)

Почему?

Все связанное сообщение в SO упоминает первый сценарий. Я хотел бы знать, почему это не сработает. Пожалуйста помоги.

ответ

3

Вы должны сделать свой внутренний класс static.

public class TransactionRequestModel { 

    public static class KeyValue {  
    String key; 
    String value; 
    //default constructor 
    //setter-getter 
    } 
    private int id; 
    private List<KeyValue> keyValueList; 
    public TransactionRequestModel(){} 
    //default constructor 
    //getter-setter 
} 
+0

Thanks @Strelok. Это сработало. Но скажите, пожалуйста, почему мы должны это делать. –

+0

Вы можете обратиться к этому ответу за хорошим объяснением. http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class – Strelok