问题
I am using Spring 4.1.4
and implementing a simple REST
service. I do have a POST
method which gets a Person
object as request.
@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
}
Bean:
public class Person {
public Person(){ }
private String firstname;
private String lastname;
private Integer activeState;
//getter+setter
}
My question is - is there a possibility to set a default value for the properties in the bean. Something like this:
@Value(default=7)
private Integer activeState;
I know when using the @RequestParam
annotation in a @RestController
methode it is possible to set a default value with @RequestParam(value="activeState", required=false, defaultValue="2")
but is there a possibility to do a similar thing on class level?
回答1:
Your Person class is not really a spring bean. It is simply a class whose parameters are set when you make a call to your application endpoint due to the @RequestBody
annotation. The parameters which are not in the body of your call will simply not get binded so to solve your problem you can do this:
Set default values for your person class like this (
toString()
is overridden for convenience: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 + '}'; } }
Perform the request to your endpoint, for example with this json data:
{ "firstName": "notDefault" }
If you print out the person object in your controller, you'll notice that the firstName got the non-default value while others are default:
public void add(@Valid @RequestBody Person oPerson) { System.out.println(oPerson); }
Console output:
Person{firstName='notDefault', lastName='default', activeState=7}
回答2:
Adding to @Edd answer, if you want to override the default values from the input, then we have to annotate the bean with @JsonAutoDetect, as follows:
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 +
'}';
}
}
来源:https://stackoverflow.com/questions/35499575/spring-4-mvc-rest-service-use-default-values-in-beans