Spring Boot自动JSON到控制器对象

时间:2016-10-25 18:53:13

标签: java json spring-mvc spring-boot jackson

我有带有依赖项的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;
}

我通过AJAX从我的HTML发送一个JSON对象,其中包含一些XRequest类型对象的字段(它是一个没有任何注释的普通POJO)。但是我的JSON没有在我的控制器方法中构造成对象,并且它的字段为空。

在控制器上进行自动反序列化时我想念的是什么?

2 个答案:

答案 0 :(得分:14)

Spring启动时带有开箱即用的杰克逊,它将负责将JSON请求体解组到Java对象

您可以使用@RequestBody Spring MVC注释来反序列化/取消编组JSON字符串到Java对象...例如。

实施例

@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);
    }
}

使用@JsonProperty使用相应的json字段名注释实体成员元素。

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;
}

答案 1 :(得分:0)

SpringBoot默认具有此功能。您只需在控制器方法的参数声明中使用@RequestBody批注,但与 @ so-random-dude answer相比,您不必注释字段使用@JsonProperty,则不是必需的。

您只需要为自定义XML对象类提供getter和setter。为了简单起见,我在下面发布了一个示例。

示例:

控制器方法声明:-

@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;
    }
}