Apache CXF + Printemps: la Génération d'un Simple Client
J'ai commencé à apprendre le Apache CXF avec le Printemps. Tout d'abord, j'ai essayé de créer un simple modèle client/serveur.
Le côté serveur est:
service.HelloWorld.java
@WebService
public interface HelloWorld {
String sayHi(String text);
}
service.HelloWorldImpl.java
@WebService(endpointInterface = "service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
public String sayHi(String text) {
return "Hello, " + text;
}
}
Le côté client est:
client.Client.java
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"cxf-client-servlet.xml"});
HelloWorld client = (HelloWorld) context.getBean("client");
System.out.println(client.sayHi("Batman"));
}
}
cxf-client-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schema/jaxws.xsd">
<bean id="client" class="service.HelloWorld" factory-bean="clientFactory" factory-method="create"/>
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="service.HelloWorld"/>
<property name="address" value="http://localhost:8080/services/HelloWorld"/>
</bean>
Le problème, c'est de rendre le client le travail, j'ai dû ajouter un service.HelloWorld (forfait + interface) pour les clients du projet. J'ai entendu dire qu'avant d'utiliser un service dont j'ai besoin pour générer un stub. Donc, c'est très confus pour moi. De sorte que, quelle est la bonne approche et quelle est la meilleure pratique (peut-être que c'est mieux d'utiliser un contrat-première approche ou autres choses de ce genre)? Plus tard, je veux ajouter WS-Security, j'ai donc besoin d'un solide background =)
Merci d'avance.
OriginalL'auteur Dmitry | 2012-01-27
Vous devez vous connecter pour publier un commentaire.
Si vous faites des code-première WS développement puis c'est bien de distribuer l'interface et la remettre au client.
je crois@WebService
n'est pas nécessaire (?) sur l'interface (mise en œuvre), de sorte que le client n'a pas de dépendances sur cette annotation.Même si vous faites de code-première web-services, vous pouvez toujours télécharger le document WSDL généré par Apache CXF et de donner au client à la place. Avec cette approche (qui est considéré comme plus mature, sans oublier qu'il peut être utilisé sur différentes plates-formes comme .NET), le client doit générer les stubs (à l'aide d'outil comme
wsdl2java
). Ce processus permettra de créer très similaire interface client automatiquement.C'est une des raisons pourquoi beaucoup de gens préfèrent le premier contrat de développement - de la même WSDL est utilisé pour générer du côté client talons et côté serveur WS mise en œuvre. Cela limite la portée de (accidentelle) incompatibilites.
Afin de vous suggérer de ne pas utiliser JaxWsProxyFactoryBean?
l'annotation est nécessaire - j'ai vérifié =)
vous pouvez soit donner au client une interface Java que vous utilisez sur le serveur ou lui donner du WSDL. Dans ce cas, le client est responsable de génération l'interface du client à partir de WSDL. Dans les deux cas
JaxWsProxyFactoryBean
est utilisé pour créer un proxy qui implémente cette interface.Bien sûr, ici c'est un article sur
wsdl2java
avec Apache CXF. Le flux de travail est simple: cet outil génère des classes Java pour tous les éléments déclarés à l'aide de Schéma XML et Java de l'interface pour chaque point de terminaison. Apache CXF code client ne sait pas quoi faire avec eux.OriginalL'auteur Tomasz Nurkiewicz
Vous pouvez utiliser un simple ressort de configuration comme ceci pour le côté client -
Ignorer l'Intercepteur si vous n'en avez pas besoin.
Plus de détails dans cette post.
Pouvez-vous expliquer exactement ce que vous recherchez?
Ok j'ai juste eu des problèmes dans ma mvn référentiel. Je pensais que l'injection de Client à l'intérieur de haricot est beaucoup plus compliqué. Nvm, mais merci pour une réponse.
OriginalL'auteur saurzcode