Spring Rest控制器的请求主体具有生成的默认值?

时间:2018-07-10 15:15:21

标签: spring jackson spring-rest

我可以使用诸如

的有效负载在我的rest控制器上发出请求
{
"id" : "dffds-fsdf-dfdf-dsf",
"name" : "toto",
"age" : "18"
}

但是body param id不是必需的,可以为null。在这种情况下,我需要生成一个ID(使用UUID或其他任何内容)

是否有一种方法可以使用例如注释?

2 个答案:

答案 0 :(得分:1)

您可以通过将默认值分配给变量的一种方法来执行此操作,因此,如果body参数id为null,则将分配此默认值,但是如果id在主体中传递,则不会分配此默认值。

public class Model {

private String name;

private String id=UUID.randomUUID().toString();

private int age;

}

答案 1 :(得分:1)

我们必须解决至少两种情况:

  1. id字段发送为null ,例如{ "id": null, ... }
  2. id字段在有效负载中不存在,例如{ "name" : "toto", "age" : "18" }

似乎没有可以产生这种行为的注释,但是以下有效负载映射类应该可以解决问题:

import java.util.UUID;

public class Payload {

    private String id = UUID.randomUUID().toString();
    private String name;
    private String age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id != null ? id : UUID.randomUUID().toString();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    /* You can safely remove this method, it's here only for test purposes. */
    public static void main(String... args) throws java.io.IOException {
        String[] tests = new String[] { 
                "{ \"id\": \"dffds-fsdf-dfdf-dsf\", \"name\": \"toto\", \"age\": \"18\" }", 
                "{ \"name\": \"toto\", \"age\": \"18\" }", 
                "{ \"age\": \"18\" }", 
                "{ \"id\": null, \"name\": \"toto\", \"age\": \"18\" }",
                "{ \"id\": null, \"age\": \"18\" }", 
                "{ \"id\": null, \"name\": \"toto\" }", 
                "{ \"id\": null }", 
                "{ }" 
            };

        for (String it : tests) {
            Payload payload = new com.fasterxml.jackson.databind.ObjectMapper().readValue(it, Payload.class);
            System.out.println(it + " => [id=" + payload.getId() + ", name=" + payload.getName() + ", age=" + payload.getAge() + "]");
        }
    }
}

如果运行main方法,您将获得如下所示的输出,该输出应满足您的要求:

{ "id": "dffds-fsdf-dfdf-dsf", "name": "toto", "age": "18" } => [id=dffds-fsdf-dfdf-dsf, name=toto, age=18]
{ "name": "toto", "age": "18" } => [id=f3218a7c-6e2c-47fc-93b9-746ceec7b56b, name=toto, age=18]
{ "age": "18" } => [id=21899f52-d273-4c89-8a16-26871f4ec351, name=null, age=18]
{ "id": null, "name": "toto", "age": "18" } => [id=0a2ba8f6-cee3-44f0-89a6-e18ac55346d2, name=toto, age=18]
{ "id": null, "age": "18" } => [id=4f8125eb-ec68-4343-a04f-1490ffb81a76, name=null, age=18]
{ "id": null, "name": "toto" } => [id=b5d59feb-5730-4929-bc41-b0f17da68a39, name=toto, age=null]
{ "id": null } => [id=ccb9b192-daa3-4877-b232-56ec483b9d8e, name=null, age=null]
{ } => [id=d56cc66c-f9af-4dea-8ad4-86c16c9921a7, name=null, age=null]