2009-11-28 4 views
4

Utilisation de mappages de contrôleur basés sur des annotations.Spring MVC très confus à propos des mappages de contrôleur

@Controller 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

Lorsque l'accès alerts/create, je reçois le message Does your handler implement a supported interface like Controller?. Cela semble étrange et contraire à ce que dit la documentation.

Alors, j'ajoute dans un RequestMapping à la classe:

@Controller 
@RequestMapping("/alerts") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

Voilà donc fonctionne. Je ne devrais pas besoin non plus @RequestMapping, mais je le fais. Maintenant, les choses deviennent bizarres. Je voulais vraiment cette commande à une `/ profil/alertes, donc je le changer à ceci:

@Controller 
@RequestMapping("/profile/alerts") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

je reçois un 404 pour aller à profile/alerts/create, mais il est toujours mis en correspondance /alerts/create pour une raison ?! ?!?!

je changer à:

@Controller 
@RequestMapping("foobar") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

Ceci est très étrange et incroyablement pratique. Quelqu'un a un moyen de résoudre ce problème, ou même de déboguer ce qui se passe?

Répondre

4

Dans votre premier extrait, vous avez raté le premier /. Il devrait être quelque chose comme @RequestMapping(value="/create", method=RequestMethod.GET)

Maintenant, vous devriez changer votre troisième extrait à cela,

@Controller 
public class AlertsController { 

    @RequestMapping(value="/profile/alerts/create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

De plus, comme vous faites votre méthode void qui attendent le DispatcherServlet de se replier sur le nom de la vue par défaut " profil/alertes/créer ". Et puis il est combiné avec un résolveur de vue approprié. Par exemple,

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

Et là vous avez 404, peut-être.

+0

J'ai eu le résolveur de vue, et cela a fonctionné. Ce qui est bizarre, c'est que je pensais que les annotations '@ RequestMapping' sur les méthodes étaient des améliorations de l'annotation au niveau de la classe; ça ne semble pas. – davetron5000

0

Vous pouvez faire correspondre URL sur l'annotation de classe et plus finegrained sur les méthodes. L'annotation de niveau de classe se préfixé à l'annotation de niveau de la méthode

@Controller 
@RequestMapping(value = "/admin") 
public class AdminController { 

    @RequestMapping(value = "/users", method = RequestMethod.GET) 
    /* matches on /admin/users */ 
    public string users() { ... } 
} 

Il est très proche de votre troisième extrait d'origine, sauf vous avez oublié un chef de file /.

Questions connexes