【JAVA】 CXF 动态请求wsdl接口
原文:https://blog.csdn.net/weixin_41884770/article/details/124032794
在cxf动态请求时,有需要BASIC 用户密码登录的情况,需要使用BUS来对用户名和密码进行处理,如果不需要进行BASIC认证,则去掉BUS部分即可.
import com.alibaba.fastjson.JSON; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.configuration.security.AuthorizationPolicy; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.cxf.transport.http.HTTPConduitConfigurer; import org.apache.cxf.transport.http.auth.DefaultBasicAuthSupplier; import org.apache.cxf.transport.http.auth.HttpAuthSupplier; /** * 请求wsdl 地址 并获取返回参数 * @param userName 用户名 * @param password 密码 * @param wsdlUrl 请求路径 * @param requestMethods 请求方法 * @param port 如果需要区分http 请求和 https请求 则需要提供这个参数 * @param data 请求数据 * @return 返回数据 */ public static String requestWsdlInterface(String userName, String password,String wsdlUrl,String requestMethods,QName port,Object data) { Bus bus = BusFactory.getThreadDefaultBus(); bus.setExtension((name, address, httpConduit) -> { final AuthorizationPolicy authorization = new AuthorizationPolicy(); authorization.setUserName(userName); authorization.setPassword(password); httpConduit.setAuthorization(authorization); final HttpAuthSupplier supplier = new DefaultBasicAuthSupplier(); httpConduit.setAuthSupplier(supplier); }, HTTPConduitConfigurer.class); JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(bus); Client client = null; if(port!=null){ client = factory.createClient( wsdlUrl, null,port); }else{ client = factory.createClient(wsdlUrl); } String response = ""; try { //得到对象所封装的值 Object objects = client.invoke(requestMethods, data); response = JSON.toJSONString(objects); } catch (Exception e) { e.printStackTrace(); } return response; }