Comment faites-vous la carte plusieurs paramètres de requête pour les champs de haricot sur Jersey OBTENIR une demande?
Un service de classe a un @GET
opération qui accepte plusieurs paramètres. Ces paramètres sont transmis en tant que paramètres de requête à la @GET
appel de service.
@GET
@Path("find")
@Produces(MediaType.APPLICATION_XML)
public FindResponse find(@QueryParam("prop1") String prop1,
@QueryParam("prop2") String prop2,
@QueryParam("prop3") String prop3,
@QueryParam("prop4") String prop4, ...)
La liste de ces paramètres sont de plus en plus, alors je voudrais les placer dans un seul haricot qui contient tous ces paramètres.
@GET
@Path("find")
@Produces(MediaType.APPLICATION_XML)
public FindResponse find(ParameterBean paramBean)
{
String prop1 = paramBean.getProp1();
String prop2 = paramBean.getProp2();
String prop3 = paramBean.getProp3();
String prop4 = paramBean.getProp4();
}
Comment le feriez-vous? Est-ce même possible?
- Départ en Jersey 2.0, je crois, vous aurez envie d'utiliser
BeanParam
- s'il vous plaît ajouter votre commentaire comme une réponse. Si une nouvelle information est disponible, alors il est normal d'ajouter une réponse, de sorte que les utilisateurs peuvent trouver les nouvelles informations sans avoir à regarder à travers les commentaires.
- Maintenant que le 2.0 est en fait publié, cela semble être une meilleure idée qu'il l'a fait quand j'ai d'abord fait le commentaire, j'ai donc pris votre suggestion. Merci!
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
com.sun.jersey.spi.inject.InjectableProvider
.Dans vos ressources, vous avez juste à utiliser
@QueryParam("valueWeDontCare")
.Le fournisseur sera automatiquement appelé.
@QueryParam
dans d'autres méthodes. Il est préférable de créer votre propre Annotation et l'utiliser à la place de@QueryParam
.@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface QueryBeanParam {}
. Ensuite, mettre en œuvreInjectableProvider<QueryBeanParam, Parameter>
au lieu deInjectableProvider<QueryParam, Parameter>
dans ParameterBeanProvider. Enfin, l'utilisation@QueryBeanParam
dans votre ressource:public FindResponse find(@QueryBeanParam ParameterBean paramBean) {...}
Dans Jersey 2.0, vous aurez envie d'utiliser BeanParam transparente fournir ce que vous cherchez dans la normale style de Maillot.
De la ci-dessus liés doc page, vous pouvez utiliser BeanParam faire quelque chose comme:
Et puis
ParameterBean.java
contient:Je préfère propriétés publiques sur mes paramètre de haricots, mais vous pouvez utiliser des getters/setters et les champs privés si vous le souhaitez, trop.
@QueryParam
pour tous les biens de mon haricot, si je les veux toutes pour être disponible?Map<String,String>
via le@Context UriInfo
. Au-delà de ça, je n'ai pas vraiment s'attendre à ce que Jersey 2.x a cuit dans quelque chose de précis juste pour ça.Essayer quelque chose comme cela. Utilisation UriInfo pour obtenir tous les paramètres de la requête dans une carte et essayez d'y accéder. Ceci est fait en place de passer des paramètres individuels.
Vous pouvez créer un Fournisseur personnalisé.
Vous pourriez vouloir utiliser l'approche suivante. C'est un très conforme à la norme de la solution et il n'y a pas de hacks là. La solution ci-dessus fonctionne également mais qui est un peu hacky parce qu'il suggère qu'il ne traite que le corps de la requête alors qu'il extrait les données du contexte.
Dans mon cas, j'ai voulu créer une annotation qui permettrait à la carte des paramètres de requête "limite" et "offset" à un seul objet. La solution est comme suit:
Ce que vous devez faire est de l'enregistrement.
Vous avez aussi besoin de l'annotation elle-même
et un haricot
Alors vous pouvez l'utiliser comme ceci