:index-group: Unrevised
:jbake-type: page
:jbake-status: status=published
= Alterar JAXWS URL

Para alterar a URI de um web service, uma solução é usar o arquivo `openejb-jar.xml`.

Neste exemplo temos um web service através da classe `Rot13`:

....
package org.superbiz.jaxws;

import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.jws.WebService;

@Lock(LockType.READ)
@Singleton
@WebService
public class Rot13 {
    public String rot13(final String in) {
        final StringBuilder builder = new StringBuilder(in.length());
        for (int b : in.toCharArray()) {
            int cap = b & 32;
            b &= ~cap;
            if (Character.isUpperCase(b)) {
                b = (b - 'A' + 13) % 26 + 'A';
            } else {
                b = cap;
            }
            b |= cap;
            builder.append((char) b);
        }
        return builder.toString();
    }
}
....

Decidimos fazer o deploy na url `/tool/rot13`.

Para fazer isso, primeiro temos que definir a rota no arquivo `openejb-jar.xml`:

....
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1">
  <enterprise-beans>
    <session>
      <ejb-name>Rot13</ejb-name>
      <web-service-address>/tool/rot13</web-service-address>
    </session>
  </enterprise-beans>
</openejb-jar>
....

Isto não é o bastante, por que, por padrão o TomEE faz o deploy do web service 
com um subcontexto chamado `webservices`. Para evitar isto simplesmente informe 
a propriedade `tomee.jaxws.subcontext` para `/` (feito no arquivo `arquillian.xml` 
para nosso teste).

Agora fizemos o deploy do nosso web service `Rot13` como esperado no contexto 
`/tool/rot13` e vamos verificar isto com o Arquillian e o TomEE embedded:

....
 package org.superbiz.jaxws;

 import org.apache.ziplock.IO;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
 import org.jboss.shrinkwrap.api.ArchivePaths;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
 import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;

 import java.net.URL;

 import static org.junit.Assert.assertThat;
 import static org.junit.internal.matchers.StringContains.containsString;

 @RunWith(Arquillian.class)
 public class Rot13Test {
     @ArquillianResource
     private URL url;

     @Deployment(testable = false)
     public static WebArchive war() {
         return ShrinkWrap.create(WebArchive.class)
                     .addClass(Rot13.class)
                     .addAsWebInfResource(new ClassLoaderAsset("META-INF/openejb-jar.xml"), ArchivePaths.create("openejb-jar.xml"));
     }

     @Test
     public void checkWSDLIsDeployedWhereItIsConfigured() throws Exception {
         final String wsdl = IO.slurp(new URL(url.toExternalForm() + "tool/rot13?wsdl"));
         assertThat(wsdl, containsString("Rot13"));
     }
 }
....
