単純なCXFはwebServiceフレームワークです。一般に、インターネットは基本的にHttp + JSONを使用してデータを交換しますが、CXFを使用する税務局、電力網、銀行など、多くの国内プロジェクトがあります。その理由はおそらく、さまざまな開発言語にサービスを提供する必要があるためです。このようにして、CXFの値が反映されます。したがって、今日は他の誰かのCXFサービスに電話する必要があります。現在SpringBootを使用しているので、cxfjarをインポートすることから始めます。
- pom.xml、基本jar、およびセキュリティ認証jarを構成します
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.2.4</version>
</dependency>
- ツールクラスのこのメソッドは、主に構成ファイルをロードすることによってファイルの値を取得します。
public class CXFUtils {
private static final Logger log = LoggerFactory.getLogger(CXFUtils.class);
private static Properties keyStoreProperties = null;
private static final String keyStoreConfigFilePath = "you.properties";
public static Properties getKeyStoreConfigFile() {
if (keyStoreProperties == null) {
keyStoreProperties = new Properties();
InputStream in = WebServiceCXFTest.class.getClassLoader().getResourceAsStream(keyStoreConfigFilePath);
try {
keyStoreProperties.load(in);
} catch (IOException e) {
log.error("keyStore配置文件加载失败.");
}
}
return keyStoreProperties;
}
}
- CallbackHandlerコールバックインターフェイスの実装は、主にパスワードを設定することによる認証に使用されます。passwdは、動的クライアントの作成に使用される識別子に関連付けられたパスワードです。
public class WSAuthHandler implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
Properties keyStoreConfigFile = CXFUtils .getKeyStoreConfigFile();
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
// 这里必须设置密码,否则会抛出:java.lang.IllegalArgumentException: pwd == null
// but a password is needed
pc.setPassword(keyStoreConfigFile.getProperty("org.apache.ws.security.crypto.merlin.alias.password"));
}
}
}
- 動的クライアントの作成の中核は、互換性のあるHttpsリクエストにアクセスすることです。
public static Client getClient() {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Properties keyStoreConfigFile = getKeyStoreConfigFile();
Client client = dcf.createClient(keyStoreConfigFile.getProperty("bjtax.wss.wsdlUrl"));
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setAutoRedirect(true);//不设置 将报错重定向
conduit.setClient(httpClientPolicy);
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(ConfigurationConstants.ACTION, ConfigurationConstants.USERNAME_TOKEN + " "
+ ConfigurationConstants.SIGNATURE + " " + ConfigurationConstants.TIMESTAMP);//这个和第三方配置一致就可以
outProps.put(ConfigurationConstants.USER, keyStoreConfigFile.getProperty("bjtax.wss.username"));//第三方分配的用户
outProps.put(ConfigurationConstants.SIGNATURE_USER, keyStoreConfigFile.getProperty("bjtax.wss.signature.user"));//签名用户
outProps.put(ConfigurationConstants.SIG_KEY_ID,
keyStoreConfigFile.getProperty("bjtax.wss.signatureKeyIdentifier"));
outProps.put(ConfigurationConstants.PASSWORD_TYPE, keyStoreConfigFile.getProperty("bjtax.wss.passwordType"));
outProps.put(ConfigurationConstants.PW_CALLBACK_CLASS,
keyStoreConfigFile.getProperty("bjtax.wss.passwordCallbackClass"));//回调方法
outProps.put(ConfigurationConstants.SIG_PROP_FILE, keyStoreConfigFilePath);//jsk 认证文件
WSS4JOutInterceptor wss4jOut = new WSS4JOutInterceptor(outProps);
client.getOutInterceptors().add(wss4jOut);
return client;
}
- XMLとエンティティの変換を解析します
public class XStreamConvertor<T extends Mto> {
private static Map<String,XStreamMarshaller> xstreamCache = new ConcurrentHashMap<String,XStreamMarshaller>();
private static final String XML_TAG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<tiripPackage xsi:type=\"tiripPackage\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.chinatax.gov.cn/dataspec/\">";
private static final String GBK = "UTF-8";
public String toXml(T pojo) throws BusinessException {
String clzName = pojo.getClass().getName();
XStreamMarshaller xstreamMarshaller = xstreamCache.get(clzName);
if(xstreamMarshaller == null) {
xstreamMarshaller = new XStreamMarshaller();
xstreamMarshaller.setEncoding(GBK);
xstreamMarshaller.setStreamDriver(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
xstreamCache.put(clzName, xstreamMarshaller);
}
XStream xStream = xstreamMarshaller.getXStream();
xStream.processAnnotations(pojo.getClass());
return XML_TAG + xStream.toXML(pojo).replaceAll("<tiripPackage>", "").replaceAll(""", "\"");
}
@SuppressWarnings("unchecked")
public T fromXml(Class<T> clz,String xml) {
String clzName = clz.getName();
XStreamMarshaller xstreamMarshaller = xstreamCache.get(clzName);
if(xstreamMarshaller == null) {
xstreamMarshaller = new XStreamMarshaller();
xstreamMarshaller.setEncoding(GBK);
xstreamMarshaller.setStreamDriver(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
xstreamCache.put(clzName, xstreamMarshaller);
}
XStream xStream = xstreamMarshaller.getXStream();
xStream.setClassLoader(clz.getClassLoader());
xStream.processAnnotations(clz);
return (T) xStream.fromXML(xml);
}
}