2

J'essaie de développer une application client autonome qui utilise des services Web dans un conteneur Glassfish (Metro). A propos de tout ce que je dois travailler est un wsdl pour les services que j'essaie d'utiliser. Le wsdl est omniprésent avec toutes sortes de balises 'wsp: Policy'. On dirait que IssuedToken, Trust13, ecryption sont tous utilisés. J'ai donc généré du code à partir de netbeans et de JAX-WS. Tout allait bien, mais en essayant de courir le client je reçois: « WST0029: emplacement STS ne peut pas être obtenu à partir soit IssuedToken ou de la configuration du client pour accéder au service http://localhost:8080/ .... »Comment traiter avec WS-Security quand tout ce que j'ai est un wsdl?

C'est quand elle a eu lieu à moi que je ne sais rien à propos de WSS. Il ne semble pas qu'un code ait été généré pour gérer la sécurité. Donc, je vais devoir partir de zéro. Alors par où commencer? Livres? Tutoriels

TIA

Répondre

2

Metro applique la politique d'exécution soit du WSDL ou le fichier de configuration WSIT-client.xml. C'est pourquoi aucun code n'est généré lié aux stratégies. Selon this post il n'est pas possible pour le moment de faire la programmation.

This tutorial explique assez bien certaines des choses que vous pouvez faire avec WSS, et bien que tout ne s'applique probablement pas dans ce cas, c'est toujours une bonne lecture.

La façon la plus simple que j'ai trouvé de générer un client avec le soutien de WSS est en utilisant le script wsimport de Metro:

cd metro/bin/ 
mkdir src target 
./wsimport.sh -s src -d target -extension -Xendorsed -verbose YourService.wsdl 

Installez ensuite Metro dans votre serveur d'applications (copier les libs aux bons endroits ou exécutez le script ant):

ant -f metro-on-glassfish.xml 

Ensuite, mettez votre fichier WSDL local dans votre classpath (par exemple votre dossier de ressources), de sorte que Metro peut l'obtenir à l'exécution d'appliquer les politiques de votre classe générée YourService:

private final static URL YOURSERVICE_WSDL_LOCATION; 

// This is enough, you don't need the wsdlLocation attribute 
// on the @WebServiceClient annotation if you have this. 
static { 
    YOURSERVICE_WSDL_LOCATION = 
     CustomerService.class.getClassLoader().getResource("YourService.wsdl"); 
} 

public YourService() { 
    super(YOURSERVICE_WSDL_LOCATION, 
      new QName("http://tempuri.org/", "YourService")); 
} 

Et si vous voulez WS-Addressing vous pourriez avoir besoin d'ajouter la fonctionnalité manuellement à votre méthode (Metro ne m'a jamais généré pour, donc je dois toujours ajouter moi-même) contraignant.

@WebEndpoint(name = "WSHttpBinding_IYourService") 
public IYourService getWSHttpBindingIYourService() { 
    WebServiceFeature wsAddressing = new AddressingFeature(true); 

    IYourService service = 
     super.getPort(new QName("http://xmlns.example.com/services/Your", 
       "WSHttpBinding_IYourService"), IYourService.class, 
       wsAddressing); 

    return service; 
} 
Questions connexes