Hi,
   Thanks for your quick response. I know it is a implementation
specific manner (e.g., lazy and eager validation ). But actualy I can
send out the message in CXF by removing the portInfo check in getPort
by setting the endpoint address in BindingProvider. If we throw
exception early, then I do not think I have chance to set address info
in BindingProvider.
                QName serviceName = new
QName("http://shengym.com/MyBusiness/","MTOM11Service";);
                QName portName = new QName("http://shengym.com/MyBusiness";, 
"MTOM11Port");
                // Setup the necessary JAX-WS artifacts
                Service svc = Service.create(serviceName);
                port = svc.getPort(portName, MTOMInterface.class);

                // Set the target URL
                bp = (BindingProvider) port;
                Map<String, Object> requestCtx = bp.getRequestContext();
                
requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,mtom11URL);


On Mon, Mar 11, 2013 at 2:58 PM, Willem jiang <[email protected]> wrote:
> Hi,
>
> If you just call the Service svc = Service.create(serviceName);
> CXF know nothing about how to build the ServiceModel as it's only a 
> ServiceName.
> When you call
> port = svc.getPort(portName, MTOMInterface.class);
> It can build the ServiceModel according to the MTOMInterface.class, but it 
> doesn't know anything about the endpoint address.
> If we don't through the exception here, user will think the port object is OK 
> for sending invocation, and it is hard for him to track the issue in the run 
> time.
> You still need to call the svc.addPort for it.
>
> BTW, it's typical usage of JAXWS API, I don't think there is anything wrong 
> with it.
>
> --
> Willem Jiang
>
> Red Hat, Inc.
> FuseSource is now part of Red Hat
> Web: http://www.fusesource.com | http://www.redhat.com
> Blog: http://willemjiang.blogspot.com (http://willemjiang.blogspot.com/) 
> (English)
>           http://jnn.iteye.com (http://jnn.javaeye.com/) (Chinese)
> Twitter: willemjiang
> Weibo: 姜宁willem
>
>
>
>
>
> On Monday, March 11, 2013 at 1:56 PM, Yanmin Sheng wrote:
>
>> We create such client which will set target address info and binding
>> info in RequestContext of BindingProvider.
>>
>> String mtom11URL = "http://localhost:9080//MyBusiness/MTOM11Service";;
>>
>> MTOMInterface port = null;
>> BindingProvider bp = null;
>>
>> System.out.println("Looking up SOAP 1.1 MTOM service");
>>
>> QName serviceName = new 
>> QName("http://shengym.com/MyBusiness/","MTOM11Service";);
>> QName portName = new QName("http://shengym.com/MyBusiness";, "MTOM11Port");
>> // Setup the necessary JAX-WS artifacts
>> Service svc = Service.create(serviceName);
>> port = svc.getPort(portName, MTOMInterface.class);
>>
>> // Set the target URL
>> bp = (BindingProvider) port;
>> Map<String, Object> requestCtx = bp.getRequestContext();
>> requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,mtom11URL);
>>
>> // Enable MTOM
>> SOAPBinding binding = (SOAPBinding) bp.getBinding();
>> binding.setMTOMEnabled(true);
>>
>> However, it reports such error:
>>
>> javax.xml.ws.WebServiceException:Port
>> {http://shengym.com/MyBusiness/}
>>
>> MTOM11Port not found.
>> org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:332)
>> org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:323)
>> javax.xml.ws.Service.getPort(Service.java:134)
>>
>> I know that the added following code can fix this error:
>> svc.addPort(portName, SOAPBinding.SOAP11HTTP_MTOM_BINDING, mtom11URL);
>>
>> Well, this error should not report even the addPort method is not called.
>> I know the added check in ServiceImpl is to avoid run time error and
>> report it as early as possible. But I think it is not needed. The
>> reasons are:
>> 1. User can get run time error later;
>> 2. User can set target addess info and bind info in other ways (as my
>> example shows)
>>
>> I remove the check from the ServiceImpl then my client code works well.
>
>

Reply via email to