Spring héritier du contrôleur MVC et le routage
Dans mon Spring MVC webapp j'ai un générique Reposant contrôleur pour les opérations CRUD. Et chaque béton contrôleur a dû déclarer seulement un @RequestMapping
par exemple /foo
. Contrôleur générique manipulé toute demande d' /foo
et /foo/{id}
.
Mais maintenant j'ai besoin d'écrire un peu plus complexe contrôleur CRUD qui aura plus de demande de paramètres ou de variables de chemin d'accès, l'adresse e.g /foo/{date}
et /foo/{id}/{date}
. Donc, je prolonger mon générique contrôleur CRUD et écrire surchargé fetch(id, date)
méthode qui permettra de traiter à la fois {id}
et {date}
. Ce n'est pas un problème.
Mais j'ai aussi besoin de "désactiver" fetch(id)
mise en œuvre dérivée à partir de la classe de base (ressources ne doivent pas être disponible à /foo/{id}
plus qu'à /foo/{id}/{date}
). La seule idée qui m'est venu est de remplacer cette méthode dans ma béton contrôleur de la carte sur un faux uri et retour null
. Mais cela ressemble plutôt moche sale hack car nous exposer quelques faux ressource uri, plutôt que de le désactiver. Peut-être il y a une meilleure pratique?
Des idées?
//My generic CRUD controller
public abstract class AbstractCRUDControllerBean<E, PK extends Serializable> implements AbstractCRUDController<E, PK> {
@RequestMapping(method=RequestMethod.GET)
public @ResponseBody ResponseEntity<E[]> fetchAll() { ... }
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public @ResponseBody ResponseEntity<E> fetch(@PathVariable("id") PK id) { ... }
@RequestMapping(method=RequestMethod.POST)
public @ResponseBody ResponseEntity<E> add(@RequestBody E entity) { ... }
@RequestMapping(value="/{id}", method=RequestMethod.PUT)
public @ResponseBody ResponseEntity<E> update(@PathVariable("id") PK id, @RequestBody E entity) { ... }
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public @ResponseBody ResponseEntity<E> remove(@PathVariable("id") PK id) { .. }
}
.
//Concrete controller, working with Foo entities
@Controller
@RequestMapping("/foo")
public class FooControllerImpl extends
AbstractCRUDControllerBean<Foo, Long> implements FooController {
//ugly overriding parent's method
@RequestMapping(value="/null",method=RequestMethod.GET)
public @ResponseBody ResponseEntity<Foo> fetch(@PathVariable("id") PK id) {
return null;
}
//new fetch implementation
@RequestMapping(value="/{id}/{date}", method=RequestMethod.GET)
public @ResponseBody ResponseEntity<Foo> fetch(@PathVariable("id") PK id, @PathVariable("date") Date date) { .... }
}
source d'informationauteur Nofate
Vous devez vous connecter pour publier un commentaire.
Sont que vous essayez d'atteindre la ressource, sous-ressource type de maillot à l'aide de printemps? Qui peut ne pas être possible directement. Au lieu de déclarer le générique de service RESTful en tant que contrôleur, pourquoi ne pas déléguer?
et délégué du contrôleur.
aussi, vous pouvez mapper méthode basée sur la disponibilité des paramètres trop,
Cette méthode maps /foo/id/date de param1 et param2 existe et param3 n'existe pas.