[ https://issues.apache.org/jira/browse/CXF-4676?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13546555#comment-13546555 ]
iris ding commented on CXF-4676: -------------------------------- Hi Freeman, seems this is a bug for DefinitionImpl.getAllPortTypes() method. To bypass this problem, I will use below code snippet for this aim: -it means getPortTypes from wsdl and all it's imported wsdl by ourself. private boolean isEmptywsdl(String wsdlUrl) { Definition definition; try { definition = getBus().getExtension(WSDLManager.class).getDefinition(wsdlUrl); List<Definition> importedDefinitions = new ArrayList<Definition>(); parseImports(definition, importedDefinitions); for (Definition def : importedDefinitions) { Set<QName> portTypes = def.getPortTypes().keySet(); for (QName sName : portTypes) { if (!definition.getPortTypes().keySet().contains(sName)) { definition.getPortTypes().put(sName, def.getPortType(sName)); } } } } catch (Exception e) { return true; } if (definition.getPortTypes().isEmpty()) { return true; } return false; } private void parseImports(Definition def, List<Definition> importedDefinitions) { for (Import impt : getImports(def)) { if (!importedDefinitions.contains(impt.getDefinition())) { importedDefinitions.add(impt.getDefinition()); parseImports(impt.getDefinition(), importedDefinitions); } } } private static Collection<Import> getImports(final Definition wsdlDef) { Collection<Import> importList = new ArrayList<Import>(); Map<?, ?> imports = wsdlDef.getImports(); for (Iterator<?> iter = imports.keySet().iterator(); iter.hasNext();) { String uri = (String)iter.next(); List<Import> lst = CastUtils.cast((List<?>)imports.get(uri)); importList.addAll(lst); } return importList; } Do you have any comments for this? This method works for the above cases. > Partial WSDL support in CXF > ---------------------------- > > Key: CXF-4676 > URL: https://issues.apache.org/jira/browse/CXF-4676 > Project: CXF > Issue Type: Bug > Components: Services > Affects Versions: 2.6.2 > Reporter: iris ding > Assignee: Freeman Fang > Attachments: cxf-4676.patch > > > I have one SEI defined as below: > @WebService(wsdlLocation="WEB-INF/wsdl/AddNumbersImplPartial1Service.wsdl") > public class AddNumbersImplPartial1 { > > public int addTwoNumbers(int number1, int number2) throws > AddNegativeNumbersException { > if (number1 < 0 || number2 < 0) { > throw new AddNegativeNumbersException("Negative > number submitted !! ", "Numbers: " + > number1 + ", " > + number2); > } > return number1 + number2; > } > } > The WEB-INF/wsdl/AddNumbersImplPartial1Service.wsdl is not complete, it only > contains to the porttype part: > <?xml version="1.0" encoding="UTF-8" standalone="yes"?> > <definitions > targetNamespace="http://serverpartial1.partialwsdl.annotations/" > name="AddNumbersImplPartial1Service" > xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:tns="http://serverpartial1.partialwsdl.annotations/" > xmlns="http://schemas.xmlsoap.org/wsdl/"> > <types> > <xsd:schema> > <xsd:import namespace="http://serverpartial1.partialwsdl.annotations/" > schemaLocation="AddNumbersImplPartial1Service_schema1.xsd"/> > </xsd:schema> > </types> > <message name="addTwoNumbers"> > <part name="parameters" element="tns:addTwoNumbers"/> > </message> > <message name="addTwoNumbersResponse"> > <part name="parameters" element="tns:addTwoNumbersResponse"/> > </message> > <message name="AddNegativeNumbersException"> > <part name="fault" element="tns:AddNegativeNumbersException"/> > </message> > <portType name="AddNumbersImplPartial1"> > <operation name="addTwoNumbers"> > <input message="tns:addTwoNumbers"/> > <output message="tns:addTwoNumbersResponse"/> > <fault name="AddNegativeNumbersException" > message="tns:AddNegativeNumbersException"/> > </operation> > </portType> > > </definitions> > Now if I put the war file into tomcat and let it use CXF, the service can not > be deployed successfully. In CXF, when it calls WSDLServiceFactory.create, it > will simply get the service name from wsdl file and in our case, since it is > empty, it will throw exception and service deployment failed. you can > reference below part: > javax.wsdl.Service wsdlService = definition.getService(serviceName); > if (wsdlService == null) { > throw new ServiceConstructionException(new > Message("NO_SUCH_SERVICE_EXC", LOG, serviceName)); > } > But per jaxws 2.2 spec, in chapter 5.2.5.5: > 5.2.5.5 Application-specified PortType > No metadata document contains a definition for the sought-after service S, > but a metadata document, say > D, contains a definition for the WSDL portType whose qualified name, say P, > matches that specified by the > endpoint being published. In this case, a JAX-WS implementation MUST create a > new description for S, > including an appropriate WSDL binding element referencing portType P. The > metadata document D MUST > be imported/included so that the published contract uses the definition of P > provided by D. No schema generation > occurs,as P is assumed to embed or import schema definitions for all the > types/elements it requires. > Like in the previous case, the implementation MUST override any location and > schemaLocation attributes. > It is an error if more than one metadata document contains a definition for > the sought-after portType > P. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira