iris ding created CXF-4713: ------------------------------ Summary: Method inherited from super interface can not be part of operations in wsdl Key: CXF-4713 URL: https://issues.apache.org/jira/browse/CXF-4713 Project: CXF Issue Type: Bug Components: JAX-WS Runtime Affects Versions: 2.6 Reporter: iris ding
I want to expose some existed class as webservice use below logic: 1. Define the SEI as below: @javax.jws.WebService public interface AddNumbersInterface extends IrisSuperInterface{ } 2. Define the implementation as below: @javax.jws.WebService (serviceName="AddNumbers") public class AddNumbers extends AddNumbersBusiness implements AddNumbersInterface{ } 3. Below the original business logic class: public class AddNumbersBusiness implements IrisSuperInterface{ public String addNumbers(int arg0, int arg1) throws AddNumbersException { if(arg0 + arg1 <0){ throw new AddNumbersException("Sum is less than 0."); } return "Result = " + String.valueOf(arg0 + arg1); } public String addNegatives(int arg0, int arg1) throws AddNegativesException { // expect 2 negative numbers if(arg0>0 || arg1>0){ throw new AddNegativesException("Expected all negative numbers."); } return "Result = " + String.valueOf(arg0 + arg1); } public String useAnno(int arg0, int arg1) throws AnnoException { if(arg0 + arg1 <0){ throw new AnnoException("userAnno: Sum is less than 0."); } return "Result = " + String.valueOf(arg0 + arg1); } } 4. Below is the original business interface: public interface IrisSuperInterface { public String addNumbers(int arg0, int arg1) throws AddNumbersException; public String addNegatives(int arg0, int arg1) throws AddNegativesException; public String useAnno(int arg0, int arg1) throws AnnoException; } Now if I deploy below ear into server and the generated wsdl is like below: <wsdl:definitions name="AddNumbers" targetNamespace="xxxxxxxx"> <wsdl:portType name="AddNumbersInterface"> </wsdl:portType> <wsdl:binding name="AddNumbersSoapBinding" type="tns:AddNumbersInterface"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> </wsdl:binding> <wsdl:service name="AddNumbers"> <wsdl:port binding="tns:AddNumbersSoapBinding" name="AddNumbersPort"><soap:address location="http://xxxxxxxxxx/AddNumbers"/></wsdl:port> </wsdl:service> </wsdl:definitions> The portType part is empty. I have a look into CXF and found :org.apache.cxf.jaxws.support.JaxWsServiceConfiguration.isWebMethod(Method) will check whether the super interface has @webservice annotation defined. so in our case it fails. According to : 3.4.1 Inheritance WSDL 1.1 does not define a standard representation for the inheritance of wsdl:portType elements. When mapping an SEI that inherits from another interface, the SEI is treated as if all methods of the inherited interface were defined within the SEI. we should not check the @webservice annotation in SEI's super interface. I propsed to add below lines into org.apache.cxf.jaxws.support.JaxWsServiceConfiguration.isWebMethod(Method), do you have any comments for it? Class<?> cls = method.getDeclaringClass(); if (cls.isInterface() && ( cls.isAssignableFrom(implInfo.getImplementorClass()) || cls.isAssignableFrom(implInfo.getSEIClass()))) { return Boolean.TRUE; } Thanks a lot! -- 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