# Spring, RequestMapping: PathVariable, RequestParam



## Manne (22. Dez 2009)

Hallo,

hab seit einigen Tagen dieses Problem (benutze Spring 3.0.RELEASE):

Merkwürdig ist, dass Spring die richtige aufzurufende Methode findet nur dann URI Templates und URI Parameter nicht aufgelöst/ gefunden werden.
Habe mich dabei u.a. an Spring 3.0 15.Web MVC framework gehalten.

Was mache ich falsch? Und wichtiger für den Moment, wie löse ich die Probleme.

Falls ihr mehr Infos benötigt, fragt nach.

Danke für eure Bemühungen.

Folgenden Klassen beschrieben mein Problem.


Controller:

```
package foo;
@Controller
public FooController
{
   // Fehler 1
   @RequestMapping(value={"/project.html","/project/"})
    public String index(@RequestParam("pid") String pid)
    {
        return "foo"+pid;
    }
    // Fehler 2
    @RequestMapping(value = "/project/{projectId}", method = RequestMethod.GET)
    public String list(@PathVariable("projectId") String projectId, ModelMap model)
    {
            model.addAttribute("project", projectId);
        return "projects";
    }
  // läuft ohne Probleme
    @RequestMapping(value={"/projects2.html"})
    public String index2()
    {
        return "foo";
    }
}
```

dazugehörige Testfall:

```
package foo;
public class FooControllerTest extends FooSuperTest
{
    @Autowired
    protected FooController fooController;
    
    @Before
    public void setUp()
    {
        adapter = new AnnotationMethodHandlerAdapter();
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
  }

   @Test
    public void testMapping2() throws Exception
    {
        System.out.println("testURLMapping");
        request.setMethod("GET");
        request.setRequestURI("/project/aadad");
        // Fehler2: Aufruf von list(String, ModelMap)
        System.out.println(adapter.getSupportedMethods());
        adapter.handle(request, response, fooController);
    }
   @Test
    public void testDdd() throws Exception
    {
        System.out.println("ddd");
        ProjectController instance = fooController;
         // Fehler1: Aufruf von index(String)
        request.setRequestURI("/project.html?pid=asd");
        adapter.handle(request, response, instance);
    }


     @Test
    public void testIndex2() throws Exception
    {
        System.out.println("ddd2");
        ProjectController instance = projectController;
        request.setRequestURI("/projects2.html");
        request.setMethod("GET");
        //Aufruf von index2()
        adapter.handle(request, response, instance);
    }
}
```


Fehlermeldungen:
Fehler 1:

```
org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: No matching handler method found for servlet request: path '/project.html?pid=asd', method 'GET', parameters map[[empty]]
```
Fehler 2:

```
org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public java.lang.String foo.fooController.list(java.lang.String,org.springframework.ui.ModelMap)]; nested exception is java.lang.IllegalStateException: Could not find @PathVariable [projectId] in @RequestMapping
```

_FooSuperTest_ implementiert lediglich das Grundgerüst für meine Spring Testklassen. Interessant ist hier 

```
@ContextConfiguration(locations =
{
    "file:C:/Projekte/foo/web/WEB-INF/test.xml"
})
```
 in dieser Datei steht unter anderem
[xml]
<context:component-scan base-package="foo" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
</bean>
[/xml]


----------

