0

I'm new to Spring, and since Spring provides many ways to map an HTTP request to Java objects, I'm hoping someone could advice me how to resolve this:

I have a client that sends a request having

 ContentType: application/x-www-form-urlencoded

Some of the request parmeters have names such as

"form_data[orderStatus]", "form_data[orderNumber]", etc'

I have no control over this client!

I have a java class (@Component) called MyOrder which looks as follows:

@component
@Scope("prototpe")
public class MyOrder {
    private String orderStatus;
    private String orderNumber;
    //etc'

    public void setOrderStatus(String orderStatus) {
         this.orderStatus = orderStatus;
    }

    //public setter for all other properties, as the above
}

What is the simplest way to create an instance of MyOrder populated with all values of all "form_data[]", so that I can have a controller method having a signature that includes a MyOrder parameter, such as:

 public ModelAndView saveNewOrder( @RequestParam("foo") String foo,
        @ModelAttribute("myOrder") MyOrder anOrder) {
        //... impl'n here
 }

The best solution I could think of was to use a Web Filter which would flaten request params names such as "form_data[attrib1]" to "attrib1", and then Spring would do all the work of populating the MyOrder instance. One disadvantage of this is that the request may have both "form_data[attrib1]" and "attrib1" parameters. For example:

 form_data[orderStatus]=ok
 orderStatus=fail

In this case i want MyOrder.orderStatus to have the value "ok".

Any good way of utilizing Spring create MyOrder from the request?

As an alternative, that does not use the class MyOrder, is there a way to have Spring map all the form_data[] parameters and their values to a map, so that i can have the controller method below?

 public ModelAndView saveNewOrder( @RequestParam("foo") String foo,
        <some annotation> @Map<String,String> formFieldsOfAnOrder) {
        //... impl'n here
        orderStatus = formFieldsOfAnOrder.get("orderStatus"); 
        //or at least: 
        orderStatus = formFieldsOfAnOrder.get("form_data[orderStatus]"); 
 }
inor
  • 2,781
  • 2
  • 32
  • 42
  • https://stackoverflow.com/questions/18280395/passing-a-mapstring-string-to-a-springmvc-controller check the answer of azpublic for mapping to a `Map`. – Roman Puchkovskiy Sep 03 '17 at 17:22
  • @Roman, I tried it... even added a setter method, public void setForm_data(java.util.Map form_data), but the member Map remained null. Perhaps because in your reference they are doing Json encoding whereas in my code the request is URL-encoded? – inor Sep 04 '17 at 06:08

0 Answers0