This is great.
I guess I will need to start another topic though, my issue is more security 
related as opposed
to bridging IoC with WS...

On Oct 5, 2011, at 7:03 AM, p.stavrini...@albourne.com wrote:

> Hello!
> 
> I am using Metro Web Services for near over a year now, and I am pretty happy 
> with it... Integration with .Net was very trivial , in-fact there is nothing 
> to do on the client except point to the wsdl file. Having said that though, 
> recently we have created some CXF web services, and the integration was also 
> very clean, there are only some slight differences btw them. Both are great, 
> Metro docs are a little thin for my liking, I battled through some edge 
> cases. The CXF web services we deployed are standalone services, with only 
> the tapestry IoC jar, whereas I integrated Metro directly into a Tapestry web 
> app. 
> 
> This is a basic outline of how I did it, I don't know if its the best 
> approach, but at the time I found very minimal help / docs, so it was largely 
> my own device. My approach has zero xml as well, which is what I was after, 
> but be warned you may have problems if you need your wsdl to be published as 
> an SSL URL, for that Endpoint.publish will not work, you need the bottom up 
> xml first approach:
> 
> 1. Create your own filter that will extend Tapestry's
> <filter>
>       <filter-name>app</filter-name>
>       <filter-class>com.web.services.entws.NewWebFilter</filter-class>
> </filter>
> 
> 
> 2. Extend TapestryFilter, Tapestry provides you a convenient extension point 
> out the box:
> 
> 
> public class NewWebFilter extends TapestryFilter {
> 
>       
>       @Override
>       protected void init(Registry registry) throws ServletException {
>               publishEndpointSingletonServices(registry, HOST_ABSOULTE_URI);
>       }
> 
>       
> // Generic method to my bind Handler chains and EndPoints
>       @SuppressWarnings("unchecked")
>       private void publishEndpointSingletonServices(Registry registry, String 
> host) {
>               for (Class<?> serviceInterface : getSingletonEndPoints()) {
>                       WebService annotation = serviceInterface
>                                       .getAnnotation(WebService.class);
>                       if (annotation != null) {
>                               Endpoint endpoint = Endpoint.create(registry
>                                               .getService(serviceInterface));
>                       
>                               
>                               //eliminates the need to bind using 
> @HandlerChain(file = "handlers.xml")
>                               List<Handler> chain = 
> endpoint.getBinding().getHandlerChain();
>                               chain.add(new WsAccessLog());
>                               chain.add(new WsSoapAccessLog());
>                               endpoint.getBinding().setHandlerChain(chain);
>                               
>                               String fullAddress = host + 
> annotation.serviceName();
>                               endpoint.publish(fullAddress);
>                               
>                       }
>               }
>       }
> 
>       /**
>        * A method to bind enterprise web service endpoints
>        * @return a list of the service endpoint proxies
>        */
>       private ArrayList<Class<?>> getSingletonEndPoints() {
>               ArrayList<Class<?>> serviceEndpointInterfaces = new 
> ArrayList<Class<?>>();
> 
>               // *** Add services here:
>               serviceEndpointInterfaces.add(WsFundQueryImpl.class);
>               serviceEndpointInterfaces.add(WsAuthenticationImpl.class);
>                ...etc
>               return serviceEndpointInterfaces;
>       }
> }
> 
> 3. Now use regular IoC bindings in your AppModule:
>               binder.bind(WsAuthenticationImpl.class).withId(
>                               "WsAuthentication");
>               binder.bind(WsFundQueryImpl.class).withId("WsFundQuery");
> 
> 
> 4. Then create your web service, it is a regular IoC service, you can use any 
> services via constructor injection as per normal (even other bound web 
> services work), only difference being the class is annotated with JAXWS 
> annotations
> 
> @WebService(serviceName = "fundquery", targetNamespace="WsClient")
> public class WsFundQueryImpl {
> 
>       private FundsService fundData_;
>       private final SOAPSessionFactory soapSessionFactory_;
>       private final WsAuthenticationImpl wsAuthentication_;
>       private final FundClassRepository fundClassRepository_;
>       private final TimeSeriesRepository timeSeriesRepository_;
> 
>       public SOAPSessionFactory getSoapSessionFactory() {
>               return soapSessionFactory_;
>       }
> 
>       public WsFundQueryImpl(FundsService fundData,
>                       SOAPSessionFactory soapSessionFactory,
>                       WsAuthenticationImpl wsAuthentication,
>                       FundClassRepository 
> fundClassRepository,TimeSeriesRepository timeSeriesRepository) throws 
> IOException {
>               fundData_ = fundData;
>               soapSessionFactory_ = soapSessionFactory;
>               castleWsAuthentication_ = wsAuthentication;
>               fundClassRepository_ = fundClassRepository;
>               timeSeriesRepository_ = timeSeriesRepository;
>               
>       }
> 
>       
>       
>       @WebMethod
>       public synchronized List<WsClientFundsContainer> 
> getFundReturnsForClient(
>                       String username, String password) {
> 
>               ...
> 
>       }
> 
> 5. You als need Metro of course, I use a profile to include it in my pom:
> <profile>
>               <id>Metro</id> 
>               <properties>
>                       <metro.version>2.2.1</metro.version> <!-- JAX-WS RI 
> version - see https://jax-ws.dev.java.net/ -->
>               </properties>
>               <activation>
>                       <activeByDefault>true</activeByDefault>
>               </activation>
>               <pluginRepositories>
>                       <pluginRepository>
>                               <id>maven2-repository.dev.java.net</id>
>                               <name>Java.net Maven 2 Repository</name>
>                               <url>http://download.java.net/maven/2/</url>
>                       </pluginRepository>
>               </pluginRepositories>
>               
>               <dependencies>
>                       <dependency>
>                               <groupId>com.sun.xml.ws</groupId>
>                               <artifactId>jaxws-rt</artifactId>
>                               <version>${metro.version}</version>
>                       </dependency>
>                       <dependency>
>                       <groupId>javax.jws</groupId>
>               <artifactId>jsr181-api</artifactId>
>               <version>1.0-MR1</version>
>            </dependency>
>                       
>               </dependencies>
>       </profile>
> 
> I am running all this on Tomcat 6, I am pretty happy with this solution. One 
> thing I have noticed though is that deploying a new version requires a 
> restart of Tomcat. Of course if you wanted more stateful web services I could 
> recommend using glassfish instead of Tomcat, as it is also an EJB container 
> and has built in support for Metro, and good tools in Netbeans, (I am using 
> eclipse though).
> 
> As you can see integration is trivial in Tapestry, but unfortunately this 
> stuff is not documented... Hope this helps u out!
> 
> Kind regards,
> Peter
> 
> 
> ----- Original Message -----
> From: "Lenny Primak" <lpri...@hope.nyc.ny.us>
> To: "Tapestry users" <users@tapestry.apache.org>
> Sent: Thursday, 22 September, 2011 19:23:52 GMT +02:00 Athens, Bucharest, 
> Istanbul
> Subject: Re: T5.2 and Metro / SOAP
> 
> I would love to see metro integration. Just because it's the default in 
> glassfish and I am already using it. Or any thoughts on how to implement it. 
> 
> 
> 
> On Sep 22, 2011, at 12:12 PM, Norman Franke <nor...@myasd.com> wrote:
> 
>> I know Metros quite Windows .NET friendly. Not sure about CXF, but if so, I 
>> could go that way, too. The question would still remain. Can you integrate 
>> Tapestry IoC with CXF relatively easily?
>> 
>> Norman Franke
>> Answering Service for Directors, Inc.
>> www.myasd.com
>> 
>> 
>> 
>> On Sep 21, 2011, at 6:35 PM, Daniel Honig wrote:
>> 
>>> Why use metro when you can use CXF?
>>> 
>>> Metro is good, but I don't think there is as much activity as CXF post the
>>> Sun/Oracle merger.
>>> 
>>> On Wed, Sep 21, 2011 at 6:31 PM, Norman Franke <nor...@myasd.com> wrote:
>>> 
>>>> I have a need to create some web services to provide SOAP access. I'm
>>>> already using Tapestry 5.2 for our web applications, so I think it would be
>>>> natural to be able to use Tapestry's IoC with Metro, if possible. This 
>>>> would
>>>> save me from having to re-implement all the DAO functionality.
>>>> 
>>>> Has anyone done this? Any thoughts on how to approach this? I'm new to
>>>> Metro, but I'm pretty comfortable with Tapestry 5.2.
>>>> 
>>>> Norman Franke
>>>> Answering Service for Directors, Inc.
>>>> www.myasd.com
>>>> 
>>>> 
>>>> 
>>>> 
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to