Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Framework, enable PUT method

I got a problem with capturing PUT request sent to server.

These are my methods:

@RequestMapping(method= RequestMethod.GET)  
public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state,  Model model) {
    System.out.println("get request");  
    return "index";  
}


@RequestMapping(method= RequestMethod.PUT)  
public String putCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) {
    System.out.println("put request");
    return "index";
}

When I traced the call, my PUT request was handled by GET method and not by PUT method in my class.. on out screen, it always read as "get request". I've checked the browser log and confirms that they sent the correct PUT request, so I think I've missed some Spring configuration here, but I don't know what it is..

Can someone please help?

Thank you.

EDIT: Additional code with class:

@Controller
@RequestMapping(value="/retail/{cid}/master/city")
public class City {

    @RequestMapping(value="/foo1", method= RequestMethod.GET)  
    public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State")   Integer state,  Model model) {
        System.out.println("get request");  
        return "index";  
    }

    @RequestMapping(value="/foo2", method= RequestMethod.PUT)  
    public String putCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) {
        System.out.println("put request");
        return "index";
    }
}

EDIT2: Sorry, it seems I didn't very thorough when examining the log.. I caught this warning twice.

WARNING: Error in annotation processing: java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

any ideas how to fix that?

like image 433
Magician Avatar asked Apr 02 '11 04:04

Magician


2 Answers

It is solved... This is the revised method that works

@Controller
@RequestMapping(value="/retail/{cid}/master/city")
public class City {

  @RequestMapping(method= RequestMethod.GET)  
  public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) {
    System.out.println("get request");  
    return "index";  
  }

  @RequestMapping(method= RequestMethod.PUT)  
  public String putCity(@PathVariable(value="cid") String cid, @RequestBody CityData state, Model model) {
    System.out.println(state.getState());
    return "index";
  }
}
public class CityData {
  private String state;
  public String getState() {
    return this.state;
  }
  public void setState(String state) {
    this.state = state;
  }
}

You could use @RequestBody String state, but I prefer to create CityData object because the sample above is oversimplification of my code, only to check on how to handle data

like image 194
Magician Avatar answered Oct 02 '22 02:10

Magician


It might have something to do with the fact that you didn't specify a mapping value. Try @RequestMapping(value="/foo", ...GET) and @RequestMapping(value="/foo", ...PUT) respectively

The documentation writes:

If you have a single default method (without explicit path mapping), then all requests without a more specific mapped method found will be dispatched to it. If you have multiple such default methods, then the method name will be taken into account for choosing between them.

About the error - you need to add the aopalliance jar to your classpath.

like image 40
Bozho Avatar answered Oct 02 '22 00:10

Bozho