diff --git a/pom.xml b/pom.xml
index 390c8cc7..81e4412e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,7 +53,6 @@
2.9.0
2.7
19.0
- 0.9.6
3.4
2.5
1.10
@@ -113,10 +112,6 @@
com.google.guava
guava
-
- org.jooq
- joor
-
@@ -162,11 +157,6 @@
guava
${guava.version}
-
- org.jooq
- joor
- ${joor.version}
-
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java
new file mode 100644
index 00000000..c73f1600
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java
@@ -0,0 +1,82 @@
+package me.chanjar.weixin.common.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import me.chanjar.weixin.common.annotation.Required;
+import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.exception.WxErrorException;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * bean操作的一些工具类
+ * Created by Binary Wang on 2016-10-21.
+ * @author binarywang(Binary Wang)
+ *
+ */
+public class BeanUtils {
+
+ /**
+ * 检查bean里标记为@Required的field是否为空,为空则抛异常
+ * @param bean 要检查的bean对象
+ * @throws WxErrorException
+ */
+ public static void checkRequiredFields(Object bean) throws WxErrorException {
+ List nullFields = Lists.newArrayList();
+
+ for (Field field : bean.getClass().getDeclaredFields()) {
+ try {
+ boolean isAccessible = field.isAccessible();
+ field.setAccessible(true);
+ if (field.isAnnotationPresent(Required.class)
+ && field.get(bean) == null) {
+ nullFields.add(field.getName());
+ }
+ field.setAccessible(isAccessible);
+ } catch (SecurityException | IllegalArgumentException
+ | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if (!nullFields.isEmpty()) {
+ throw new WxErrorException(WxError.newBuilder().setErrorMsg("必填字段 " + nullFields + " 必须提供值").build());
+ }
+ }
+
+ /**
+ * 将bean按照@XStreamAlias标识的字符串内容生成以之为key的map对象
+ * @param bean 包含@XStreamAlias的xml bean对象
+ * @return map对象
+ */
+ public static Map xmlBean2Map(Object bean) {
+ Map result = Maps.newHashMap();
+ for (Field field : bean.getClass().getDeclaredFields()) {
+ try {
+ boolean isAccessible = field.isAccessible();
+ field.setAccessible(true);
+ if (field.get(bean) == null) {
+ field.setAccessible(isAccessible);
+ continue;
+ }
+
+ if (field.isAnnotationPresent(XStreamAlias.class)) {
+ result.put(field.getAnnotation(XStreamAlias.class).value(),
+ field.get(bean).toString());
+ }
+
+ field.setAccessible(isAccessible);
+ } catch (SecurityException | IllegalArgumentException
+ | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ return result;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
index 6da1001e..9745e22c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
@@ -1,12 +1,9 @@
package me.chanjar.weixin.mp.api.impl;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import me.chanjar.weixin.common.annotation.Required;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.common.util.BeanUtils;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
import me.chanjar.weixin.mp.api.WxMpPayService;
import me.chanjar.weixin.mp.api.WxMpService;
@@ -23,15 +20,12 @@ import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
-import org.joor.Reflect;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
-import java.lang.reflect.Field;
import java.security.KeyStore;
import java.util.*;
-import java.util.Map.Entry;
/**
* Created by Binary Wang on 2016/7/28.
@@ -116,7 +110,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
request.setMchId(partnerId);
request.setNonceStr( System.currentTimeMillis() + "");
request.setOpUserId(partnerId);
- String sign = this.createSign(this.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
+ String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
request.setSign(sign);
String url = PAY_BASE_URL + "/secapi/pay/refund";
@@ -138,8 +132,8 @@ public class WxMpPayServiceImpl implements WxMpPayService {
return wxMpPayRefundResult;
}
- private void checkParameters(WxMpPayRefundRequest request) {
- checkNotNullParams(request);
+ private void checkParameters(WxMpPayRefundRequest request) throws WxErrorException {
+ BeanUtils.checkRequiredFields(request);
if (StringUtils.isNotBlank(request.getRefundAccount())) {
if(!ArrayUtils.contains(REFUND_ACCOUNT, request.getRefundAccount())){
@@ -171,7 +165,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
request.setMchId(mchId);
request.setNonceStr(System.currentTimeMillis() + "");
- String sign = this.createSign(this.xmlBean2Map(request),
+ String sign = this.createSign(BeanUtils.xmlBean2Map(request),
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
request.setSign(sign);
@@ -194,29 +188,6 @@ public class WxMpPayServiceImpl implements WxMpPayService {
return redpackResult;
}
- private Map xmlBean2Map(Object bean) {
- Map result = Maps.newHashMap();
- for (Entry entry : Reflect.on(bean).fields().entrySet()) {
- Reflect reflect = entry.getValue();
- if (reflect.get() == null) {
- continue;
- }
-
- try {
- Field field = bean.getClass().getDeclaredField(entry.getKey());
- if (field.isAnnotationPresent(XStreamAlias.class)) {
- result.put(field.getAnnotation(XStreamAlias.class).value(),
- reflect.get().toString());
- }
- } catch (NoSuchFieldException | SecurityException e) {
- e.printStackTrace();
- }
-
- }
-
- return result;
- }
-
/**
* 微信公众号支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3)
* @param packageParams 原始参数
@@ -253,7 +224,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
request.setNonceStr(System.currentTimeMillis() + "");
- String sign = this.createSign(this.xmlBean2Map(request),
+ String sign = this.createSign(BeanUtils.xmlBean2Map(request),
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
request.setSign(sign);
@@ -271,8 +242,8 @@ public class WxMpPayServiceImpl implements WxMpPayService {
return result;
}
- private void checkParameters(WxUnifiedOrderRequest request) {
- checkNotNullParams(request);
+ private void checkParameters(WxUnifiedOrderRequest request) throws WxErrorException {
+ BeanUtils.checkRequiredFields(request);
if (! ArrayUtils.contains(TRADE_TYPES, request.getTradeType())) {
throw new IllegalArgumentException("trade_type目前必须为" + Arrays.toString(TRADE_TYPES) + "其中之一");
@@ -287,27 +258,6 @@ public class WxMpPayServiceImpl implements WxMpPayService {
}
}
- private void checkNotNullParams(Object request) {
- List nullFields = Lists.newArrayList();
- for (Entry entry : Reflect.on(request).fields()
- .entrySet()) {
- Reflect reflect = entry.getValue();
- try {
- Field field = request.getClass().getDeclaredField(entry.getKey());
- if (field.isAnnotationPresent(Required.class)
- && reflect.get() == null) {
- nullFields.add(entry.getKey());
- }
- } catch (NoSuchFieldException | SecurityException e) {
- e.printStackTrace();
- }
- }
-
- if (!nullFields.isEmpty()) {
- throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值");
- }
- }
-
@Override
public Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException {
WxUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request);
@@ -345,7 +295,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
@Override
public WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException {
- checkNotNullParams(request);
+ BeanUtils.checkRequiredFields(request);
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxEntPayRequest.class);
@@ -355,7 +305,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
request.setNonceStr(System.currentTimeMillis() + "");
- String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
+ String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
request.setSign(sign);
String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers";
@@ -380,7 +330,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
request.setNonceStr(System.currentTimeMillis() + "");
- String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
+ String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
request.setSign(sign);
String url = PAY_BASE_URL + "/mmpaymkttransfers/gettransferinfo";
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
index 39c7f729..e1984204 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
@@ -1,23 +1,19 @@
package me.chanjar.weixin.mp.api.impl;
-import com.google.common.collect.Lists;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
-import me.chanjar.weixin.common.annotation.Required;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.common.util.BeanUtils;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.WxMpStoreService;
import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo;
import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-import org.joor.Reflect;
-import java.lang.reflect.Field;
import java.util.List;
-import java.util.Map.Entry;
/**
* Created by Binary Wang on 2016/9/26.
@@ -35,7 +31,7 @@ public class WxMpStoreServiceImpl implements WxMpStoreService {
@Override
public void add(WxMpStoreBaseInfo request) throws WxErrorException {
- checkParameters(request);
+ BeanUtils.checkRequiredFields(request);
String url = API_BASE_URL + "/addpoi";
String response = this.wxMpService.post(url, request.toJson());
@@ -71,28 +67,6 @@ public class WxMpStoreServiceImpl implements WxMpStoreService {
}
}
- private void checkParameters(WxMpStoreBaseInfo request) {
- List nullFields = Lists.newArrayList();
- for (Entry entry : Reflect.on(request).fields()
- .entrySet()) {
- Reflect reflect = entry.getValue();
- try {
- Field field = request.getClass().getDeclaredField(entry.getKey());
- if (field.isAnnotationPresent(Required.class)
- && reflect.get() == null) {
- nullFields.add(entry.getKey());
- }
- } catch (NoSuchFieldException | SecurityException e) {
- e.printStackTrace();
- }
- }
-
- if (!nullFields.isEmpty()) {
- throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值");
- }
-
- }
-
@Override
public WxMpStoreListResult list(int begin, int limit)
throws WxErrorException {
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
index 6e31b769..e610204b 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
@@ -30,6 +30,7 @@ public class WxMpStoreServiceImplTest {
* @throws WxErrorException
*/
public void testAdd() throws WxErrorException {
+ this.wxMpService.getStoreService().add(WxMpStoreBaseInfo.builder().build());
this.wxMpService.getStoreService()
.add(WxMpStoreBaseInfo.builder().businessName("haha").branchName("abc")
.province("aaa").district("aaa").telephone("122").address("abc").categories(new String[] { "美食,江浙菜" })
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java
deleted file mode 100644
index feb50c5a..00000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package me.chanjar.weixin.mp.bean.pay;
-
-import java.lang.reflect.Field;
-import java.util.Map.Entry;
-
-import org.joor.Reflect;
-import org.testng.annotations.Test;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-@Test
-public class WxSendRedpackRequestTest {
-
- public void test() throws NoSuchFieldException, SecurityException {
-
- WxSendRedpackRequest request = new WxSendRedpackRequest();
- request.setMchBillno("123");
- request.setActName("ab");
- for (Entry entry : Reflect.on(request).fields().entrySet()) {
- Reflect reflect = entry.getValue();
- if (reflect.get() == null) {
- continue;
- }
-
- Field field = WxSendRedpackRequest.class.getDeclaredField(entry.getKey());
- if (field.isAnnotationPresent(XStreamAlias.class)) {
- System.err.println(reflect.get() + " = " + field.getAnnotation(XStreamAlias.class).value());
- }
- }
-
- }
-
-}