web-dev-qa-db-ja.com

コントローラでのオブジェクトへのSpring Boot自動JSON

私はその依存関係を持つ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はコントローラーメソッドでオブジェクトに構築されません。そのフィールドはヌルです。

コントローラーでの自動シリアル化解除で見落としているものは何ですか?

10
kamaci

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;
}
16
so-random-dude

SpringBootはデフォルトでこの機能を備えています。コントローラメソッドのパラメータ宣言で@RequestBodyアノテーションを使用する必要がありますが、@ so-random-dudeanswer@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;
    }
}