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
注释,它的参数被设置。不在您的调用主体中的参数将不会被绑定,因此要解决您的问题,您可以这样做:
像这样为你的人 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 +
'}';
}
}
向您的端点执行请求,例如使用此 json 数据:
{
"firstName": "notDefault"
}
如果你在你的控制器中打印出 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 +
'}';
}
}
我正在使用 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
注释,它的参数被设置。不在您的调用主体中的参数将不会被绑定,因此要解决您的问题,您可以这样做:
像这样为你的人 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 + '}'; } }
向您的端点执行请求,例如使用此 json 数据:
{ "firstName": "notDefault" }
如果你在你的控制器中打印出 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 +
'}';
}
}