Spring 4 MVC - Rest 服务 - 在 bean 中使用默认值

Spring 4 MVC - Rest service - use default values in beans

我正在使用 Spring 4.1.4 并实现一个简单的 REST 服务。我确实有一个 POST 方法,它根据请求获取一个 Person 对象。

@ResponseStatus(value = HttpStatus.CREATED)
@RequestMapping(value = "", method = RequestMethod.POST, headers = "Accept=application/json", consumes = "application/json")
public void add(@Valid @RequestBody Person oPerson) throws Exception {
    //do the things
}

豆豆:

public class Person {

    public Person(){ }

    private String firstname;

    private String lastname;

    private Integer activeState;

    //getter+setter
}

我的问题是 - 是否可以为 bean 中的属性设置默认值。像这样:

@Value(default=7)
private Integer activeState;

我知道在 @RestController 方法中使用 @RequestParam 注释时可以使用 @RequestParam(value="activeState", required=false, defaultValue="2") 设置默认值但是是否有可能在 class等级?

你的人 class 并不是真正的 spring 豆子。它只是一个 class ,当你调用你的应用程序端点时,由于 @RequestBody 注释,它的参数被设置。不在您的调用主体中的参数将不会被绑定,因此要解决您的问题,您可以这样做:

  1. 像这样为你的人 class 设置默认值(toString() 为方便起见被覆盖:

    public class Person {
    
        public Person() {
        }
    
        private String firstName = "default";
        private String lastName = "default";
        private Integer activeState = 7;
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public Integer getActiveState() {
            return activeState;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    ", activeState=" + activeState +
                    '}';
        }
    }
    
  2. 向您的端点执行请求,例如使用此 json 数据:

    {
        "firstName": "notDefault"
    }
    
  3. 如果你在你的控制器中打印出 person 对象,你会注意到 firstName 得到了非默认值而其他的是默认值:

    public void add(@Valid @RequestBody Person oPerson) {
        System.out.println(oPerson);
    }
    

控制台输出: Person{firstName='notDefault', lastName='default', activeState=7}

添加到@Edd 答案,如果你想覆盖输入的默认值,那么我们必须注释 bean与@JsonAutoDetect,如下:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
public class Person {

    public Person() {
    }

    private String firstName = "default";
    private String lastName = "default";
    private Integer activeState = 7;

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public Integer getActiveState() {
        return activeState;
    }

    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", activeState=" + activeState +
                '}';
    }
}