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

13,118

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:

  1. 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 +
                    '}';
        }
    }
    
  2. Perform the request to your endpoint, for example with this json data:

    {
        "firstName": "notDefault"
    }
    
  3. 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}

Share:
13,118
K.E.
Author by

K.E.

Senior Java Developer

Updated on June 15, 2022

Comments

  • K.E.
    K.E. almost 2 years

    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?

  • Ben
    Ben over 4 years
    Great, 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
    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
    Praytic over 2 years
    This 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.