À l'aide de Java-les génériques type de modèle le repos de la Réponse de l'objet via GenericEntity<List<T>>
J'ai un générique de JAX-RS classe de ressource et j'ai défini un générique findAll
méthode
public abstract class GenericDataResource<T extends GenericModel> {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response findAll() {
Query query = em.createNamedQuery(modelClass.getSimpleName()+".findAll");
List<T> list = query.getResultList();
return Response.ok(new GenericEntity<List<T>>(list) {}).build();
}
}
et de classe d'Utilisateur:
public class User extends GenericModel {
...
}
Et ici est un exemple de définition de sous-classe:
@Path("users")
public class UserResource extends GenericDataResource<User> {
public UserResource() {
super(User.class);
}
}
- Je obtenir ci-dessous Exception:
com.sun.jersey.api.MessageException: A message body writer for Java class
java.util.Vector, and Java type java.util.List<T>,
and MIME media type application/json was not found exception.
Si je remplace T avec une classe définie comme User
comme suit:
GenericEntity<List<User>>(list)
puis il fonctionne très bien.
Aucune idée de la façon dont je peux le faire fonctionner avec des génériques de T?
Le point de l'ensemble de la super type de jeton est de capturer des informations génériques qui autrement seraient effacées. En essayant de rendre le jeton lui-même générique est une sorte de ... contre-productif.
J'ai besoin de "T s'étend GenericModel" comme il existe des fonctions dont j'ai besoin pour accéder dans la classe abstraite comme T. getId()
J'ai besoin de "T s'étend GenericModel" comme il existe des fonctions dont j'ai besoin pour accéder dans la classe abstraite comme T. getId()
OriginalL'auteur Emin | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
Une fois que le code source est compilé, le (anonyme) de la classe créée par la ligne:
utilise une variable de type à se référer à ses parents. Etant donné que le type des variables n'ont aucune valeur au moment de l'exécution, vous ne pouvez pas utiliser des génériques de ce genre. Vous êtes obligés de passer un soi-disant type de jeton de la vocation du site. C'est un exemple qui exige que le jeton soit passé de l'appelant de
findAll()
, mais vous pourriez avoir besoin de l'un dans le constructeur et l'enregistrer dans une variable d'instance:L'appelant envoie un jeton comme
Si vous n'utilisez que non paramétrée sous-classes,
findAll()
peut prendre avantage de la réflexion pour construire le jeton (non testé, j'espère que vous voyez l'idée):Vous avez à mettre en œuvre
getType()
de retourner le type désiré. Il va être une sous-classe deParameterizedType
capable de définir le typeList<DAO<User>>
Pas besoin de surcharger. Le code appelant
findAll()
doit passer un jeton, mais la méthode elle-même fonctionne sans modification. BTW, si vous êtes à la absolument sûr que vous n'utiliserezGenericDataResource<T>
via non paramétrée sous-classes commeUserResource
, vous pouvez obtenir le jeton via la réflexion (à restaurer 0-arité pourfindAll()
)En fait il n'y a pas de méthode qui appelle explicitement findAll. Il est appelé via des annotations. J'ai édité la question afin de montrer l'JAX-RS annotations.
Utilisez-vous seulement non-génériques sous-classes?
Je suis la mise en place d'un projet complet, mais je pense que j'ai fait une erreur stupide. Il n'y a pas besoin de retourner un
List<DAO<User>>
puisque vous n'avez besoin de représenter unList<User>
. De sorte que vous pouvez mettre à jour votreUserResource
comme je l'ai fait démoOriginalL'auteur Raffaele
En plus des réponses, à lire la Réponse de l'objet de retour sur le client :
OriginalL'auteur jediz
Réponse objet sera retournée au client en réponse à une demande est envoyée à un serveur. La classe de Réponse a Réponse.ResponseBuilder intérieur de la classe qui recueille chacune des propriétés de son champ de ce type de Réponse.ResponseBuilder. Réponse.ResponseBuilder applique le Générateur de modèle de conception pour construire la Réponse de l'Objet.
La méthode build() est responsable de connecter la chaîne de Réponse.ResponseBuilder objets formé au cours de la construction.
E. g.
statut de retour de méthode de Réponse.ResponseBuilder après l'attribution du STATUT
objet entité affecte l'entité( la charge utile retourné) de type
Réponse.ResponseBuilder et sera affectée à la Réponse de l'instance varible de. Après cela, l'état attribue également le statut et renvoie la Réponse.ResponseBuilder instance. Le constructeur se connecte à l'heure de la méthode build() de l'appel.
Enfin, la construction de la méthode construit complète(avec les propriétés énoncées) Réponse.
Maintenant vient la question de GenericEntity objet. Il Représente une entité de réponse d'un type générique T.
Par Exemple,
GenericEntity> obj = new GenericEntity>(lst) {};
Réponse.statut(200).entité( obj ).build();
obj est le type de la Liste ci-dessus. entité méthode accepte Objet type qui est générique. Dans le cas où, la nécessité d'un type spécifique se pose, vous avez passer comme argument de GenericEntity type par qui, à l'exécution, il est coulé à un objet de type Spécifique.
Utilisation Pratique
Voulais pour mon Maillot de Cadre pour répondre JSON de type Tableau qui a été l'objet de Liste dans mon Java modèle de retour du client dans le cadre de la Réponse de l'objet.
Par conséquent,
nouveau GenericEntity> --- jette de l'objet/charge utile de type Liste
nouveau GenericEntity --- runtime type devient de Chaîne
De ressources sur Webservice Côté
Sortie
Réponse envoyée au client.
[
"La banane",
"Apple"
]
Comment Lire Entité de Réponse
OriginalL'auteur Yergalem
Pour résoudre un fait une méthode pour renvoyer une
GenericEntity
et puis un l'appeler de ma classe générique, quelque chose comme ci-dessous:OriginalL'auteur cristianchiess