How can I configure the target namespace globally in JAX-WS web services?

timomeinen picture timomeinen · Jun 4, 2013 · Viewed 13.5k times · Source

I have a lot of endpoints annotated with @WebService(targetNamespace = "mynamespace"). Every @WebResult and @WebParam has the same definition of targetNamespace = "mynamespace".

Is there a way to configure JAX-WS (Metro implementation) to use "mynamespace" as targetNamespace by default?

I would like to use the annotations without any attributes and get rid of the duplicate declarations, just like convention over configuration.

Answer

Paul Vargas picture Paul Vargas · Jun 4, 2013

Only put the targetNamespace in the service endpoint interface or service implementation bean.

/**
* Annotated Implementation Object
*/
@WebService(
    name = "CustomerService",
    targetNamespace = "http://org.company.services"
)
public class CustomerService {
    @WebMethod
    @WebResult(name="CustomerRecord")
    public CustomerRecord locateCustomer(
        @WebParam(name="FirstName") String firstName,
        @WebParam(name="LastName") String lastName,
        @WebParam(name="Address") USAddress addr) {
        ...
    }
};

If @WebResult or @WebParam have no targetNamespace, the default is the targetNamespace for the Web Service.

In another hand, you can avoid the all annotations and only use the @WebService if you don't need something custom with JAX-B.

See more in JSR-181 Web Services Metadata for the JavaTM Platform