Question

Je travaille actuellement sur un projet qui permet aux utilisateurs de réserver (via le Web) l'utilisation d'une ressource choisie pour une période de temps donnée. Dans ce programme, je suis en train de garder la philosophie de printemps (et le général les meilleures pratiques) de la programmation aux interfaces et en tant que telle que je essayer d'utiliser des interfaces partout où la fonctionnalité est répétée entre les classes concrètes.

Une interface que j'ai créé est appelé BookableResourceController qui spécifie les méthodes requises par un contrôleur pour gérer la fonctionnalité minimale requise pour tout type de ressource à réserver. Je fais également l'utilisation d'une seconde interface, BookableResource, qui identifie les objets modèle une ressource qui est autorisé à être réservé par l'application.

Le problème que je suis actuellement en est que quelques-unes des méthodes définies par BookableResourceController utilisent la cartographie @RequestBody pour convertir un objet JSON dans un paramètre de méthode, et puisque Jackson ne peut convertir JSON en objets « SimpleType », je reçois une erreur si je spécifie le paramètre d'entrée à un BookableResource.

@RequestMapping(value="/delete.html", method = RequestMethod.POST)  
public ModelAndView processDeleteResource(
    @RequestBody BookableResource resource); 
  

Impossible de construire instance de   org.codehaus.jackson.map.type.SimpleType,   problème: types abstraits ne peuvent être   instancié avec un type supplémentaire   informations

D'après ce que je peux dire à ce moyen d'erreur que je vais devoir définir une implémentation spécifique de BookableResource, ce qui signifie que je sera très probablement nécessaire d'exclure ces méthodes de l'interface même si un contrôleur qui doit être utilisé à cette fin, il faudra ces méthodes.

Ce que je vous demande est si quelqu'un sait un moyen de définir une interface comme l'objet qui est attendu d'une cartographie @RequestBody utilisant JSON, ou que quelqu'un a des suggestions sur la façon de structurer mon interface de contrôleur afin d'inclure ces méthodes?

Vive

Était-ce utile?

La solution

Je ne suis pas sûr que ça marcherait, mais vous pouvez essayer de le rendre générique:

public interface BookableResourceController<R extends BookableResource> {
    @RequestMapping(value="/delete.html", method = RequestMethod.POST)
    public ModelAndView processDeleteResource(@RequestBody R resource); 
}

Autres conseils

autre façon d'aller qui peut être utilisé est à l'interface annoter avec l'annotation Jackson:

@JsonDeserialize(as=BookableResourceImp.class)

(éventuellement à l'aide mélange dans annotations si l'on ne veut pas l'ajouter directement dans la classe d'interface)

EDIT : Une autre possibilité est d'utiliser la méthode SimpleModule addAbstractTypeMapping() pour spécifier le type de mise en œuvre. On évite ainsi de l'interface, liaison à la mise en œuvre, et peut (ou non) être de façon plus pratique d'enregistrer cet aspect.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top