Home > database >  How to have query string parameter(s) and field name(s) different
How to have query string parameter(s) and field name(s) different

Time:02-01

I have a controller which will have 3 query strings.

Instead of having 3 fields in controller, I am defining them in class.

public class PassengerInformation{
   String travellerAddress;
   String travellerAge;
   String travellerName;
}

Now in controller , I am able to accept them

@GetMapping("/passenger-info)
public TravelInformation getPassengerInfo(PassengerInformation info){
//Call a service
}

Now, this works as expected, if I pass the query string as is. eg: /passenger-info?travellerAge=21.

But, How do I accept the query parameter names different to it's corresponding fieldName.

I should be able to call it as below: /passenger-info?traveller_age=21&traveller_name=JohnWick&traveller_address=ST.

CodePudding user response:

Try to add the following constructor to your class

public class PassengerInformation{
       String travellerAddress;
       String travellerAge;
       String travellerName;
    
       @ConstructorProperties({"traveller_address", "traveller_age", "traveller_name"})
       public PassengerInformation(String travellerAddress, String travellerAge, String travellerName) {
                this.travellerAddress = travellerAddress;
                ...
       }
    
    }
  

CodePudding user response:

The best you can do by the default features without any customisation is to use @ConstructorProperties :

public class PassengerInformation {
    String travellerAddress;
    String travellerAge;
    String travellerName;
    
    @ConstructorProperties({ "traveller_address", "traveller_age", "traveller_name" })
    public PassengerInformation(String travellerAddress, String travellerAge, String travellerName) {
        this.travellerAddress = travellerAddress;
        this.travellerAge = travellerAge;
        this.travellerName = travellerName;

    }
}

This behaviour is mentioned at the docs as follows :

The @ModelAttribute parameter instance (i.e PassengerInformation) is sourced in one of the following ways:

  • Retrieved from the model where it may have been added by a @ModelAttribute method.

  • Retrieved from the HTTP session if the model attribute was listed in the class-level @SessionAttributes annotation.

  • Obtained through a Converter where the model attribute name matches the name of a request value such as a path variable or a request parameter (see next example).

  • Instantiated using its default constructor.

  • Instantiated through a “primary constructor” with arguments that match to Servlet request parameters. Argument names are determined through JavaBeans @ConstructorProperties or through runtime-retained parameter names in the bytecode.

The caveat here is that you need to make sure there are no default constructor in the PassengerInformation :

public class PassengerInformation {

   public PassengerInformation(){}

}

  •  Tags:  
  • Related