私はその依存関係を持つSpringBootアプリケーションを持っています:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
私のコントローラーには次のようなメソッドがあります:
@RequestMapping(value = "/liamo", method = RequestMethod.POST)
@ResponseBody
public XResponse liamo(XRequest xRequest) {
...
return something;
}
私はHTMLからJSONオブジェクトをAJAX XRequest型オブジェクトのいくつかのフィールドを使用して送信します(注釈のないプレーンなPOJOです)。ただし、JSONはコントローラーメソッドでオブジェクトに構築されません。そのフィールドはヌルです。
コントローラーでの自動シリアル化解除で見落としているものは何ですか?
Springブートには、JSON要求本文のJavaオブジェクトへのマーシャリング解除を処理するジャクソンが付属しています
@RequestBody Spring MVCアノテーションを使用して、JSON文字列をJava object ...にデシリアライズ/アンマーシャリングできます...
@RestController
public class CustomerController {
//@Autowired CustomerService customerService;
@RequestMapping(path="/customers", method= RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public Customer postCustomer(@RequestBody Customer customer){
//return customerService.createCustomer(customer);
}
}
エンティティメンバー要素に、対応するjsonフィールド名を使用して@JsonPropertyで注釈を付けます。
public class Customer {
@JsonProperty("customer_id")
private long customerId;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
@JsonProperty("town")
private String town;
}
SpringBootはデフォルトでこの機能を備えています。コントローラメソッドのパラメータ宣言で@RequestBody
アノテーションを使用する必要がありますが、@ so-random-dudeの answer@JsonProperty
でフィールドに注釈を付ける必要はありません。これは必須ではありません。
カスタムXMLオブジェクトクラスのゲッターとセッターを提供する必要があります。簡単にするために、以下の例を投稿しています。
例:
コントローラーメソッドの宣言:-
@PostMapping("/create")
public ResponseEntity<ApplicationResponse> createNewPost(@RequestBody CreatePostRequestDto createPostRequest){
//do stuff
return response;
}
カスタムXMLオブジェクトクラス:-
public class CreatePostRequestDto {
String postPath;
String postTitle;
public String getPostPath() {
return postPath;
}
public void setPostPath(String postPath) {
this.postPath = postPath;
}
public String getPostTitle() {
return postTitle;
}
public void setPostTitle(String postTitle) {
this.postTitle = postTitle;
}
}