: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`:

[source,java]
----
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`:

[source,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:

[source,java]
----
 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"));
     }
 }
----
