2017-01-31 7 views
1

私のコントローラでは、新しいToDoItemを作成するためにhttprequest(私が送ったJSON)を解析したいと思います。 JSONを使ってlocalhost:8080/todos/newでPOSTを実行し、私のコントローラーはそのhttprequestをJSONに変え、そこからデータを解析してコンストラクターで使用する必要があります。ここ は、これまでの私のコードです:httprequestからJSONを作成してそれを構文解析します

// CREATE NEW TODOITEM FROM SENT JSON 
@PostMapping("/todos/new") 
public ResponseEntity<ToDoItem> newToDo(
     @RequestBody ToDoItem toDoItem, 
     Principal principal 
) { 
    User currentUser = userRepository.findByUsername(principal.getName()); 
    toDoItemService.addToDo(toDoItem, currentUser); 
    return ResponseEntity.ok(toDoItem); 
} 

ところで、ここで日付として使用するための最良の選択となりますか?カレンダーは大丈夫ですか? JSONで解析して送信することについて話します。

EDIT: 注釈(セッターとゲッターはommited)と私のエンティティ:

@Entity 
@Table (name = "TO_DO_ITEMS") 
public class ToDoItem extends BaseEntity { 

@Column(name = "TITLE", nullable = false) 
private String title; 

@Column(name = "COMPLETED") 
private boolean completed; 

@Column(name = "DUE_DATE", nullable = false) 
@JsonDeserialize(using = LocalDateDeserializer.class) 
@JsonSerialize(using = LocalDateSerializer.class) 
protected LocalDate dueDate; 

// a ToDoItem is only associated with one user 
@ManyToOne(cascade=CascadeType.PERSIST) 
@JoinColumn(name = "USER_ID") 
private User user; 


// JPA demands empty constructor 
public ToDoItem() {} 

public ToDoItem(User user, String title, LocalDate dueDate) { 
    this.user = user; 
    this.title = title; 
    this.dueDate = dueDate; 
} 

そして、私が送っ:

{ 
"title":"testtodo", 
"dueDate": [ 
    2017, 
    10, 
    06 
] 
} 

私は不正な要求エラーを取得:

{ 
"timestamp": 1485948636705, 
"status": 400, 
"error": "Bad Request", 
"exception":  "org.springframework.http.converter.HttpMessageNotReadableException", 
"message": "Could not read document: Invalid numeric value: Leading zeroes not allowed\n at [Source: [email protected]; line: 6, column: 4]\n at [Source: [email protected]; line: 6, column: 3] (through reference chain: com.doublemc.domain.ToDoItem[\"dueDate\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid numeric value: Leading zeroes not allowed\n at [Source: [email protected]; line: 6, column: 4]\n at [Source: [email protected]; line: 6, column: 3] (through reference chain: com.doublemc.domain.ToDoItem[\"dueDate\"])", 
"path": "/todos/new" 
} 
+0

あなたは自分のJSONのサンプルを貼り付けることで、Javaでモデルを作成するには、このウェブサイトを使用することができます。 //www.jsonschema2pojo.org –

答えて

1

これが私のやり方です。

// CREATE NEW TODOITEM FROM SENT JSON 
@PostMapping("/todos/new") 
public String newToDo(@RequestBody TodoItem todoItem) { 
    String title = todoItem.getTitle(); // extract title 
    LocalDate dueDate = todoItem.getDueDate; // extract dueDate 

    // getting logged in user 
    User currentUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    User userFromDb = userRepository.findOne(currentUser.getId()); 


    ToDoItem newToDoItem = new ToDoItem(userFromDb, title, dueDate); 

あなたToDoItemオブジェクトにLocalDateにJSONの日付を変換するコンバータが必要になります注意してください。研究MappingJackson2HttpMessageConverter詳細については、

あなた自身を変換したい場合は、タイプStringdueDateを持っている代わりにDTOを使用してJavaコードでLocalDateに変換してからToDoItemエンティティオブジェクトにDTOに変換することができます。
public String newToDo(@RequestBody TodoItemDto todoItemDto)

私はjava.time.LocalDateを好む。 JSONのデシリアライザは、ここにも使用することができます

UPDATE
、以下の記事をチェックアウトします。http:
jsong deserialization

+0

しかし、JSONでLocalDateの標準フォーマットを使用しても、私はまだMessageConverterを使用する必要がありますか?または上のコードは正常に動作しますか? – doublemc

+0

はい、必要です。私はしばらくそれを試していない。私が最後に使ったのはそれが本当だったと確信しています。 JSONデシリアライザを使用することもできます。私はこれを含めるために私の答えを更新しました。 –

+0

使い方を教えてください。エンティティにアノテーションを追加する必要がありますか?自分の投稿を自分の投稿に追加しました。私もコントローラーを更新しました。私は – doublemc

関連する問題