SpringREST控制器是否具有生成默认值的请求主体?

SpringREST控制器是否具有生成默认值的请求主体?,spring,jackson,spring-rest,Spring,Jackson,Spring Rest,我可以在我的rest控制器上有一个负载请求,比如 { "id" : "dffds-fsdf-dfdf-dsf", "name" : "toto", "age" : "18" } 但是body参数id不是强制性的,可以为null。在这种情况下,我需要生成一个ID(使用UUID或其他任何东西) 例如,有没有一种方法可以使用注释来实现这一点 一种方法是将默认值分配给变量,因此如果body param id为null,则会分配此默认值,但如果在body中传递了id,则不会分配此默认值 public c

我可以在我的rest控制器上有一个负载请求,比如

{
"id" : "dffds-fsdf-dfdf-dsf",
"name" : "toto",
"age" : "18"
}
但是body参数id不是强制性的,可以为null。在这种情况下,我需要生成一个ID(使用UUID或其他任何东西)


例如,有没有一种方法可以使用注释来实现这一点

一种方法是将默认值分配给变量,因此如果body param id为null,则会分配此默认值,但如果在body中传递了id,则不会分配此默认值

public class Model {

private String name;

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

private int age;

}

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

  • id
    字段作为
    null
    发送,例如
    {“id”:null,…}
  • 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]
    

    请修复JSON语法,缺少逗号和双引号。