Wednesday, April 6, 2011

Receiving an array of Object from a web form using Spring framework

Hi,

I have a form JSP web page, this form contains multiple instances of the same Java object, I am using Java Spring Framework to control the "communication" with the controller and the view.

My problem is that i would like to be able to receive from the view a simple array containing the instances of my objects wich are currently on the page (on wich were probably modified).

When i want a specific kind of item, I usually just name it in my controller's method declaration, however for an array (or any Collection), this won't work.

so something like:

@RequestMapping
public String edit(...SomeObject[] objectName, ...){
}

would just return me an error, i can however receive an array of String, so this works:

@RequestMapping
public String edit(...String[] objectString, ...){
}

the goal would be to be able to make Spring automatically map the object thanks for your answers!

From stackoverflow
  • This is certainly possible; while I've not done it using @RequestMapping, I know that you can retrieve a collection it can be done with a "command" object (or @ModelAttribute)

    Define a POJO with a collection attribute as your command

    public class FooCommand {
        private List<String> myCollection;
        // Getter & Setter
    }
    

    Then access it in your controller

    @RequestMapping(value = "/foo", method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("fooCommand") FooCommand fooCmd) {
        // do stuff with fooCmd.getMyCollection() 
    }
    

    That make any sense?

    Gadgetsan : that works, however, what i need is to be able to receiving something other than a String, i would like Spring to automatically map the received String to a POJO
    : What kind of object? If can handle stuff like string, long, int, char (i think) but if it's a more complex object, you'll need to work with the property editor mentioned by Mark.
    Gadgetsan : my object contains strings and integers, it can map 1 item, the problem arises when i try to map an array or a list of item
    Gadgetsan : if i try to ask for a list, i receive a GenericSignatureFormatError Exception, if i try to ask for an array, i get: Could not instantiate bean class [SrbAdminInvMask;]: No default constructor found; nested exception is java.lang.NoSuchMethodException: [SrbAdminInvMask;.()
    : Can you post a more code? GenericSignatureFormatError is a really odd error to get, as is the default contructor problem...
    Gadgetsan : i'm sorry i cannot really post more code, but i finally used a different approach, i do the conversion from a String to the object myself. I think i was getting the GenericSignatureFormatError since i was trying to get a "List" wich if i remember correctly cannot be instanciated by itself
  • Spring does not know how to create your custom object from a String so you will need to create your own PropertyEditor for your custom object.

    Chapter 5 of the Spring Reference explains data binding and there is an example in Chapter 13 of how to register custom property editors in your controller.

    : If you're converting something like a string to a date, yes, property editors are certainly needed. However, if you're submitting a form with foo=a, foo=b and foo=c, Spring MVC is smart enough to turn that into a List named "foo"...
    Gadgetsan : i was confused about initBinder and what was a property editor but i found an exemple there http://robobruin.blogspot.com/2007/09/spring-initbinder-example-that.html
    Gadgetsan : the thing i need to receive is rather something like foo.atr1 = a foo.atr2 = b List foo
    : ah, i can see why spring would have a hard time; from spring's perspective, foo.atr1 and foo.atr2 are two different parameters. if you need something like that though, you can probably dump them in a map by naming them foo['atr1'] = a

    0 comments:

    Post a Comment