Spring 4 MVC - Rest service - use default values in beans
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}
Comments
-
K.E. almost 2 years
I am using
Spring 4.1.4
and implementing a simpleREST
service. I do have aPOST
method which gets aPerson
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? -
Ben over 4 yearsGreat, and what if your dto's are immutable? Also I don't believe it's the responsibility of dto object to dictate the behavior or controller endpoint
-
Edd over 4 years@Ben if they're immutable, then handle default value assignment in the controller method. That is, check which values are missing and make a new copy of your immutable object with them being assigned.
-
Praytic over 2 yearsThis is not a good case when we have the same DTO for multiple endpoints. Some endpoints would like to have different default values or no default values at all.