diff --git a/data/xxx-demo.mv.db b/data/xxx-demo.mv.db
index b981e53..097982e 100644
Binary files a/data/xxx-demo.mv.db and b/data/xxx-demo.mv.db differ
diff --git a/pom.xml b/pom.xml
index 664ba26..ed2ad2b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,11 +55,48 @@
+
+
+
+
+
+
+
+
- com.alibaba
- fastjson
- 2.0.35
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.18.0
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.18.0
+
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ 2.18.0
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.18.0
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.8.8
+
+
cn.hutool
hutool-poi
@@ -70,6 +107,10 @@
org.springframework.boot
spring-boot-starter-thymeleaf
+
+ com.jayway.jsonpath
+ json-path
+
diff --git a/src/main/java/org/lsh/webservice/ui/config/XMLGregorianCalendarTypeAdapter.java b/src/main/java/org/lsh/webservice/ui/config/XMLGregorianCalendarTypeAdapter.java
new file mode 100644
index 0000000..b1fba86
--- /dev/null
+++ b/src/main/java/org/lsh/webservice/ui/config/XMLGregorianCalendarTypeAdapter.java
@@ -0,0 +1,36 @@
+package org.lsh.webservice.ui.config;
+
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+public class XMLGregorianCalendarTypeAdapter extends TypeAdapter {
+ @Override
+ public void write(JsonWriter jsonWriter, XMLGregorianCalendar value) throws IOException {
+ // 将XMLGregorianCalendar转换为字符串写入JSON
+ jsonWriter.value(value.toXMLFormat());
+ }
+
+ @Override
+ public XMLGregorianCalendar read(JsonReader in) throws IOException {
+ // 从JSON读取字符串并转换为XMLGregorianCalendar
+ try {
+ String dateString = in.nextString();
+ GregorianCalendar calendar = new GregorianCalendar();
+ Date date = DateFormat.getDateInstance().parse(dateString);
+ calendar.setTime(date);
+ return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
+ } catch (ParseException | DatatypeConfigurationException e) {
+ throw new IOException("Failed to parse XMLGregorianCalendar", e);
+ }
+ }
+}
diff --git a/src/main/java/org/lsh/webservice/ui/controller/MainController.java b/src/main/java/org/lsh/webservice/ui/controller/MainController.java
index ce93968..b16eadf 100644
--- a/src/main/java/org/lsh/webservice/ui/controller/MainController.java
+++ b/src/main/java/org/lsh/webservice/ui/controller/MainController.java
@@ -1,7 +1,8 @@
package org.lsh.webservice.ui.controller;
import cn.hutool.core.collection.CollectionUtil;
-import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.lsh.webservice.ui.common.Result;
import org.lsh.webservice.ui.entity.FormField;
import org.lsh.webservice.ui.entity.FormItemV2;
@@ -10,6 +11,7 @@ import org.lsh.webservice.ui.entity.dto.ServerInfo;
import org.lsh.webservice.ui.entity.tree.Operation;
import org.lsh.webservice.ui.entity.tree.Project;
import org.lsh.webservice.ui.entity.tree.Webservice;
+import org.lsh.webservice.ui.entity.vo.DynamicWebVO;
import org.lsh.webservice.ui.entity.vo.OperationQueryVO;
import org.lsh.webservice.ui.entity.vo.Wsdl;
import org.lsh.webservice.ui.mapper.OperationMapper;
@@ -34,6 +36,8 @@ public class MainController {
OperationMapper operationMapper;
@Resource
ServerInfoMapper serverInfoMapper;
+ @Resource
+ ObjectMapper objectMapper;
@PostMapping("/add-webservice")
@ResponseBody
@@ -63,8 +67,12 @@ public class MainController {
Operation operation = new Operation();
operation.setWebserviceId(webservice.getId());
operation.setName(formItemV2.getOperation());
- operation.setInput(JSON.toJSONString(formItemV2.getInput()));
- operation.setOutput(JSON.toJSONString(formItemV2.getOutput()));
+ try {
+ operation.setInput(objectMapper.writeValueAsString(formItemV2.getInput()));
+ operation.setOutput(objectMapper.writeValueAsString(formItemV2.getOutput()));
+ } catch (JsonProcessingException e) {
+ return Result.failed(e.getMessage());
+ }
operationMapper.insert(operation);
}
}
@@ -81,7 +89,12 @@ public class MainController {
ServerInfo serverInfo = serverInfoMapper.findByWebserviceId(webservice.getId());
if(serverInfo != null){
String formJson = serverInfo.getFormJson();
- FormV2 formV2 = JSON.parseObject(formJson, FormV2.class);
+ FormV2 formV2 = null;
+ try {
+ formV2 = objectMapper.readValue(formJson, FormV2.class);
+ } catch (JsonProcessingException e) {
+ return Result.failed(e.getMessage());
+ }
return Result.ok(formV2);
}
return Result.ok();
@@ -90,17 +103,20 @@ public class MainController {
@PostMapping("/query-projects")
@ResponseBody
public Result> queryProjects(
- ){
+ @RequestParam(value = "loadWebservice",defaultValue = "true")String loadWebservice,
+ @RequestParam(value = "loadOperation",defaultValue = "true")String loadOperation
+ ){
//
List projects = projectMapper.findAll();
-
- for (Project project : projects) {
- List webserviceList = webserviceMapper.findByProjectId(project.getId());
- project.setChildren(webserviceList);
- if(CollectionUtil.isNotEmpty(webserviceList)){
- for (Webservice webservice : webserviceList) {
- List operationList = operationMapper.findByWebserviceId(webservice.getId());
- webservice.setChildren(operationList);
+ if(loadWebservice.equals("true")) {
+ for (Project project : projects) {
+ List webserviceList = webserviceMapper.findByProjectId(project.getId());
+ project.setChildren(webserviceList);
+ if (CollectionUtil.isNotEmpty(webserviceList) && loadOperation.equals("true")) {
+ for (Webservice webservice : webserviceList) {
+ List operationList = operationMapper.findByWebserviceId(webservice.getId());
+ webservice.setChildren(operationList);
+ }
}
}
}
@@ -120,8 +136,12 @@ public class MainController {
Webservice webservice = webserviceMapper.findById(operation.getWebserviceId());
operationQueryVO.setOperation(operation.getName());
operationQueryVO.setId(operation.getId());
- operationQueryVO.setInput(JSON.parseObject(operation.getInput(), FormField.class));
- operationQueryVO.setOutput(JSON.parseObject(operation.getOutput(), FormField.class));
+ try {
+ operationQueryVO.setInput(objectMapper.readValue(operation.getInput(), FormField.class));
+ operationQueryVO.setOutput(objectMapper.readValue(operation.getOutput(), FormField.class));
+ } catch (JsonProcessingException e) {
+ return Result.failed(e.getMessage());
+ }
if(webservice != null){
operationQueryVO.setWsdl(webservice.getWsdl());
operationQueryVO.setWebserviceName(webservice.getName());
@@ -130,6 +150,24 @@ public class MainController {
return Result.ok(operationQueryVO);
}
+ @PostMapping("/invoke")
+ @ResponseBody
+ public Result invoke(
+ @RequestBody DynamicWebVO webservice
+ ){
+ try {
+ FormField formField = ExplainWebservice.dynamicInvoke(webservice.getWsdl()
+ , webservice.getMethod()
+ , webservice.getInput()
+ , webservice.getOutput()
+ , webservice.getJson());
+ return Result.ok(formField);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return Result.failed("调用发生了异常~"+e.getMessage());
+ }
+ }
+
@RequestMapping("/index")
public String hello(){
return "index"; // index.html页面
diff --git a/src/main/java/org/lsh/webservice/ui/entity/FormField.java b/src/main/java/org/lsh/webservice/ui/entity/FormField.java
index 5a5f2df..841eef7 100644
--- a/src/main/java/org/lsh/webservice/ui/entity/FormField.java
+++ b/src/main/java/org/lsh/webservice/ui/entity/FormField.java
@@ -7,7 +7,10 @@ public class FormField implements Serializable {
protected String fieldName;
protected String typeName;
+ protected String genericType;
protected boolean require;
+ protected Object value;
+
private List fields;
public String getFieldName() {
@@ -41,4 +44,20 @@ public class FormField implements Serializable {
public void setFields(List fields) {
this.fields = fields;
}
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+ public String getGenericType() {
+ return genericType;
+ }
+
+ public void setGenericType(String genericType) {
+ this.genericType = genericType;
+ }
}
diff --git a/src/main/java/org/lsh/webservice/ui/entity/MyParameterizedType.java b/src/main/java/org/lsh/webservice/ui/entity/MyParameterizedType.java
new file mode 100644
index 0000000..2782f81
--- /dev/null
+++ b/src/main/java/org/lsh/webservice/ui/entity/MyParameterizedType.java
@@ -0,0 +1,30 @@
+package org.lsh.webservice.ui.entity;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+public class MyParameterizedType implements ParameterizedType {
+ private Type[] args;
+
+ private Class rawType;
+
+ public MyParameterizedType( Class rawType,Type[] args) {
+ this.args = args;
+ this.rawType = rawType;
+ }
+
+ @Override
+ public Type[] getActualTypeArguments() {
+ return args;
+ }
+
+ @Override
+ public Type getRawType() {
+ return rawType;
+ }
+
+ @Override
+ public Type getOwnerType() {
+ return null;
+ }
+}
diff --git a/src/main/java/org/lsh/webservice/ui/entity/dto/ServerInfo.java b/src/main/java/org/lsh/webservice/ui/entity/dto/ServerInfo.java
index 0e03137..f274dea 100644
--- a/src/main/java/org/lsh/webservice/ui/entity/dto/ServerInfo.java
+++ b/src/main/java/org/lsh/webservice/ui/entity/dto/ServerInfo.java
@@ -6,6 +6,9 @@ public class ServerInfo {
private int webserviceId;
private String formJson;
+ public ServerInfo() {
+ }
+
public ServerInfo(int webserviceId, String formJson) {
this.webserviceId = webserviceId;
this.formJson = formJson;
diff --git a/src/main/java/org/lsh/webservice/ui/entity/vo/DynamicWebVO.java b/src/main/java/org/lsh/webservice/ui/entity/vo/DynamicWebVO.java
new file mode 100644
index 0000000..019dd6b
--- /dev/null
+++ b/src/main/java/org/lsh/webservice/ui/entity/vo/DynamicWebVO.java
@@ -0,0 +1,52 @@
+package org.lsh.webservice.ui.entity.vo;
+
+import org.lsh.webservice.ui.entity.FormField;
+
+public class DynamicWebVO {
+
+ private String wsdl;
+ private String method;
+ private FormField input;
+ private FormField output;
+ private String json;
+
+ public String getWsdl() {
+ return wsdl;
+ }
+
+ public void setWsdl(String wsdl) {
+ this.wsdl = wsdl;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public FormField getInput() {
+ return input;
+ }
+
+ public void setInput(FormField input) {
+ this.input = input;
+ }
+
+ public FormField getOutput() {
+ return output;
+ }
+
+ public void setOutput(FormField output) {
+ this.output = output;
+ }
+
+ public String getJson() {
+ return json;
+ }
+
+ public void setJson(String json) {
+ this.json = json;
+ }
+}
diff --git a/src/main/java/org/lsh/webservice/ui/utils/ExplainField.java b/src/main/java/org/lsh/webservice/ui/utils/ExplainField.java
index ccfced7..22124db 100644
--- a/src/main/java/org/lsh/webservice/ui/utils/ExplainField.java
+++ b/src/main/java/org/lsh/webservice/ui/utils/ExplainField.java
@@ -1,5 +1,6 @@
package org.lsh.webservice.ui.utils;
+import cn.hutool.core.collection.CollectionUtil;
import org.lsh.webservice.ui.entity.FormField;
import java.lang.reflect.Array;
@@ -13,7 +14,16 @@ import java.util.ArrayList;
import java.util.List;
public class ExplainField {
- public static void explain(Field declaredField, List formFieldList) throws ClassNotFoundException {
+
+ public static void explain(Object o,Field declaredField, List formFieldList) throws ClassNotFoundException, IllegalAccessException {
+ // 集合
+ FormField complexType = new FormField();
+ Object currentValue = null;
+ if(o != null){
+ declaredField.setAccessible(true);
+ currentValue = declaredField.get(o);
+ complexType.setValue(currentValue);
+ }
// 判断Field类型
if(declaredField.getType() == List.class || declaredField.getType() == Array.class){
// 获取List的泛型类型
@@ -22,9 +32,9 @@ public class ExplainField {
ParameterizedType parameterizedType = (ParameterizedType)genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
if(actualTypeArguments.length>0){
- FormField complexType = new FormField();
complexType.setFieldName(declaredField.getName());
complexType.setTypeName(declaredField.getType().getTypeName());
+
List formFields = new ArrayList<>();
complexType.setFields(formFields);
// 获取List的泛型类型
@@ -32,9 +42,53 @@ public class ExplainField {
Class classes = (Class) actualTypeArgument;
// 泛型类加载器
if(classes != null) {
- Field[] declaredFields2 = classes.getDeclaredFields();
- for (Field declaredField2 : declaredFields2) {
- explain(declaredField2, formFields);
+ complexType.setGenericType(classes.getTypeName());
+ if(currentValue != null){
+ List> list = (List)currentValue;
+ if(CollectionUtil.isEmpty(list)){
+ currentValue = null;
+ // 集合第一个对象
+ FormField firstObj = new FormField();
+ firstObj.setFieldName("0");
+ firstObj.setTypeName(classes.getTypeName());
+ formFields.add(firstObj);
+
+ List firstObjFields = new ArrayList<>();
+ firstObj.setFields(firstObjFields);
+ Field[] declaredFields2 = classes.getDeclaredFields();
+ for (Field declaredField2 : declaredFields2) {
+ explain(currentValue,declaredField2, firstObjFields);
+ }
+ }else{
+ for (int i = 0; i < list.size(); i++) {
+ Object o1 = list.get(i);
+ // 集合第一个对象
+ FormField firstObj = new FormField();
+ firstObj.setFieldName(i+"");
+ firstObj.setTypeName(classes.getTypeName());
+ formFields.add(firstObj);
+
+ List firstObjFields = new ArrayList<>();
+ firstObj.setFields(firstObjFields);
+ Field[] declaredFields2 = classes.getDeclaredFields();
+ for (Field declaredField2 : declaredFields2) {
+ explain(o1,declaredField2, firstObjFields);
+ }
+ }
+ }
+ }else{
+ // 集合第一个对象
+ FormField firstObj = new FormField();
+ firstObj.setFieldName("0");
+ firstObj.setTypeName(classes.getTypeName());
+ formFields.add(firstObj);
+
+ List firstObjFields = new ArrayList<>();
+ firstObj.setFields(firstObjFields);
+ Field[] declaredFields2 = classes.getDeclaredFields();
+ for (Field declaredField2 : declaredFields2) {
+ explain(currentValue,declaredField2, firstObjFields);
+ }
}
}
formFieldList.add(complexType);
@@ -52,26 +106,37 @@ public class ExplainField {
|| declaredField.getType() == LocalDate.class
|| declaredField.getType().getTypeName().equals("int")
|| declaredField.getType().getTypeName().equals("long")){
- FormField basic = new FormField();
- basic.setFieldName(declaredField.getName());
- basic.setTypeName(declaredField.getType().getTypeName());
- formFieldList.add(basic);
- System.out.println(declaredField);
+
+ complexType.setFieldName(declaredField.getName());
+ complexType.setTypeName(declaredField.getType().getTypeName());
+ formFieldList.add(complexType);
+
}else {
// 自定义的数据类型
System.out.println("进入自定义数据类型:" + declaredField.getName() + "====" + declaredField.getType());
// 获取该字段的参数类型
Class class2 = (Class)declaredField.getGenericType();
Field[] declaredFields = class2.getDeclaredFields();
- FormField complexType = new FormField();
+
complexType.setFieldName(declaredField.getName());
complexType.setTypeName(declaredField.getType().getTypeName());
List formFields = new ArrayList<>();
complexType.setFields(formFields);
for (Field field : declaredFields) {
- explain(field, formFields);
+ explain(currentValue,field, formFields);
}
formFieldList.add(complexType);
}
}
+
+ public static boolean isList(String typeName){
+ return "java.util.List".equals(typeName) || "java.lang.Arrays".equals(typeName);
+ }
+
+ public static String switchToObject(String typeName1,String typeName2){
+ if(isList(typeName1)){
+ return typeName2;
+ }
+ return typeName1;
+ }
}
diff --git a/src/main/java/org/lsh/webservice/ui/utils/ExplainWebservice.java b/src/main/java/org/lsh/webservice/ui/utils/ExplainWebservice.java
index feda5cf..a65c252 100644
--- a/src/main/java/org/lsh/webservice/ui/utils/ExplainWebservice.java
+++ b/src/main/java/org/lsh/webservice/ui/utils/ExplainWebservice.java
@@ -1,17 +1,26 @@
package org.lsh.webservice.ui.utils;
import cn.hutool.core.collection.CollectionUtil;
-import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.service.model.*;
+import org.lsh.webservice.ui.config.XMLGregorianCalendarTypeAdapter;
import org.lsh.webservice.ui.entity.FormItemV2;
import org.lsh.webservice.ui.entity.FormV2;
import org.lsh.webservice.ui.entity.FormField;
+import org.lsh.webservice.ui.entity.MyParameterizedType;
+import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import java.lang.reflect.Field;
+import java.lang.reflect.Type;
import java.util.*;
public class ExplainWebservice {
@@ -32,13 +41,6 @@ public class ExplainWebservice {
formV2.setServerName(serviceInfo.getName().getLocalPart());
/**创建Service*/
Collection bindings = serviceInfo.getBindings();
- Map extensionAttributes = serviceInfo.getExtensionAttributes();
- if(extensionAttributes != null) {
- extensionAttributes.forEach((key, val) -> {
- System.out.println("key:" + key + " values:" + val);
- });
- }
-
// portType
// 对于某个访问入口点类型所支持的操作的抽象集合; ----》服务端SEI
// 指出了这个WebService所有支持的操作,就是说有哪些方法可供调用。
@@ -71,11 +73,11 @@ public class ExplainWebservice {
System.out.println("====>"+aClass);
for (Field declaredField : declaredFields) {
System.out.println("declaredField:" + declaredField);
- org.lsh.webservice.ui.utils.ExplainField.explain(declaredField, formFields);
+ org.lsh.webservice.ui.utils.ExplainField.explain(null,declaredField, formFields);
}
- System.out.println("解析表单结果:" + JSON.toJSONString(complex));
+ //System.out.println("解析表单结果:" + JSON.toJSONString(complex));
messageMap.put(aClass.getSimpleName(),complex);
- } catch (ClassNotFoundException e) {
+ } catch (ClassNotFoundException | IllegalAccessException e) {
e.printStackTrace();
}
}
@@ -92,25 +94,140 @@ public class ExplainWebservice {
String inputTypeName = "";
String outputTypeName = "";
+ FormItemV2 itemV2 = new FormItemV2();
+ itemV2.setOperation(function);
+
OperationInfo operationInfo = operation.getOperationInfo();
- List inputMessageParts = operationInfo.getInput().getMessageParts();
+ if(operation.isUnwrapped()){
+ operationInfo = operation.getUnwrappedOperation().getOperationInfo();
+ }
+ BindingMessageInfo messageInfo = null;
+ if(operation.isUnwrapped()){
+ messageInfo = operation.getUnwrappedOperation().getInput();
+ }else{
+ messageInfo = operation.getWrappedOperation().getInput();
+ }
+
+ List messageParts = messageInfo.getMessageInfo().getMessageParts();
+ StringBuilder params = new StringBuilder();
+ for (MessagePartInfo messagePart : messageParts) {
+ String typeName = messagePart.getTypeClass().getTypeName();
+ String param = messagePart.getName().getLocalPart();
+ if(params.length()>0){
+ params.append(",");
+ }
+ params.append(typeName+" "+param);
+ }
+ System.out.println("function==================>:" + function + "(" + params.toString()+")");
+
+ List inputMessageParts = messageInfo.getMessageParts();
for (MessagePartInfo inputMessagePart : inputMessageParts) {
inputTypeName = inputMessagePart.getTypeClass().getSimpleName();
+ String name = inputMessagePart.getName().getLocalPart();
+ // 如果是参数命名,那么再往下,获取实际传参
+ FormField input = messageMap.get(inputTypeName);
+// if("parameters".equals(name) && input.getFields().size()>0){
+// input = input.getFields().get(0);
+// }
+ itemV2.setInput(input);
}
List outputMessageParts = operationInfo.getOutput().getMessageParts();
for (MessagePartInfo outputMessagePart : outputMessageParts) {
outputTypeName = outputMessagePart.getTypeClass().getSimpleName();
+ String name = outputMessagePart.getName().getLocalPart();
+ // 如果是参数命名,那么再往下,获取实际传参
+ FormField output = messageMap.get(outputTypeName);
+// if("parameters".equals(name) && output.getFields().size()>0){
+// output = output.getFields().get(0);
+// }
+ itemV2.setOutput(output);
}
-
-
- FormItemV2 itemV2 = new FormItemV2();
- itemV2.setOperation(function);
- itemV2.setInput(messageMap.get(inputTypeName));
- itemV2.setOutput(messageMap.get(outputTypeName));
itemV2s.add(itemV2);
}
}
}
return formV2;
}
+
+ public static FormField dynamicInvoke(String wsdl
+ ,String method
+ ,FormField input
+ ,FormField output
+ ,String json) throws Exception {
+ ObjectMapper objectMapper = new ObjectMapper();
+ // 创建动态客户端
+ JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
+ Client client = factory.createClient(wsdl);
+ String inputClassName = ExplainField.switchToObject(input.getTypeName(),input.getGenericType());
+ Class> inputClass = Thread.currentThread().getContextClassLoader().loadClass(inputClassName);
+ // 如果输入值是集合,那么需要将集合转化为对应类型
+ JavaType inputJavaType = objectMapper.getTypeFactory().constructCollectionType(List.class, inputClass);
+ MyParameterizedType type = new MyParameterizedType(List.class, new Type[]{inputClass});
+
+ String outputClassName = ExplainField.switchToObject(output.getTypeName(),output.getGenericType());
+ Class> outputClass = Thread.currentThread().getContextClassLoader().loadClass(outputClassName);
+ JavaType outputJavaType = objectMapper.getTypeFactory().constructCollectionType(List.class, outputClass);
+
+
+ Object request = null;
+ if(ExplainField.isList(input.getTypeName())){
+ objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+ //objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
+ objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES,false);
+// request = objectMapper.readValue(json, inputJavaType);
+ Gson gson = new GsonBuilder()
+ .registerTypeAdapter(XMLGregorianCalendar.class, new XMLGregorianCalendarTypeAdapter())
+ .create();
+ request = gson.fromJson(json, type);
+ }else{
+ request = objectMapper.readValue(json, inputClass);
+ }
+ Object[] invoke = client.invoke(method,request);
+ FormField complex = new FormField();
+
+ if(invoke != null && invoke.length>0){
+ String responseJson = objectMapper.writeValueAsString(invoke[0]);
+ System.out.println("=====response======>"+responseJson);
+ Object response = null;
+ if(ExplainField.isList(output.getTypeName())){
+ response = objectMapper.readValue(responseJson, outputJavaType);
+ System.out.println("=====response======>"+response);
+ List formFields = new ArrayList<>();
+ complex.setFieldName(output.getFieldName());
+ complex.setFields(formFields);
+ complex.setTypeName(output.getTypeName());
+ complex.setGenericType(output.getGenericType());
+
+ // 如果本身就是集合,那么字段名称就是下标
+ List list = (List) response;
+ for (int i = 0; i < list.size(); i++) {
+ Object o1 = list.get(i);
+ List indexFormFields = new ArrayList<>();
+ FormField indexForm = new FormField();
+ indexForm.setTypeName(o1.getClass().getTypeName());
+ indexForm.setFields(indexFormFields);
+ indexForm.setFieldName(i+"");
+ Field[] declaredFields = o1.getClass().getDeclaredFields();
+ for (Field declaredField : declaredFields) {
+ org.lsh.webservice.ui.utils.ExplainField.explain(o1,declaredField, indexFormFields);
+ }
+ formFields.add(indexForm);
+ }
+ }else{
+ response = objectMapper.readValue(responseJson, outputClass);
+ System.out.println("=====response======>"+response);
+ List formFields = new ArrayList<>();
+ complex.setFields(formFields);
+ complex.setTypeName(outputClassName);
+ complex.setFieldName(output.getFieldName());
+ Field[] declaredFields = outputClass.getDeclaredFields();
+ for (Field declaredField : declaredFields) {
+ org.lsh.webservice.ui.utils.ExplainField.explain(response,declaredField, formFields);
+ }
+ }
+ }
+ return complex;
+ }
+
+
}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index b280051..ae78d88 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -15,6 +15,8 @@ spring:
username: sa
password: password
platform: h2
+ hikari:
+ pool-name: h2-
h2:
console:
enabled: true
diff --git a/src/main/resources/static/vue/addwsdl.js b/src/main/resources/static/vue/addwsdl.js
index fda3bbe..63c61f4 100644
--- a/src/main/resources/static/vue/addwsdl.js
+++ b/src/main/resources/static/vue/addwsdl.js
@@ -4,8 +4,7 @@ Vue.component('add-wsdl', {
-
-
+
@@ -21,9 +20,10 @@ Vue.component('add-wsdl', {
props: ['isshow'], // html接收字段名都是小写,单向传递
data() {
return {
+ projectList: [],
form: {
wsdl: '',
- projectId: '1'
+ projectId: 1
}
}
},
@@ -37,7 +37,32 @@ Vue.component('add-wsdl', {
// }
// },
},
+ created(){
+ this.queryProjects();
+ },
methods: { // 组件内方法
+ queryProjects(){
+ var _this = this;
+ $.ajax({
+ type: 'POST',
+ url: '/query-projects?loadWebservice=false&loadOperation=false',
+ contentType:'application/json',
+ timeout: 5000,
+ data: JSON.stringify({}),
+ dataType: "JSON",
+ success: function ({code,data}, textStatus, jqXHR) {
+ if(data && code === 0){
+ _this.projectList = data;
+ if(_this.projectList && _this.projectList.length>0){
+ _this.form.projectId = _this.projectList[0].id
+ }
+ }
+ },
+ error: function (xhrJson,status,error) {
+
+ }
+ });
+ },
onSubmit(){
var _this = this;
$.ajax({
@@ -54,6 +79,7 @@ Vue.component('add-wsdl', {
console.log(data)
if(code === 0){
_this.$message.success(msg);
+ _this.$emit('reload-projects');
}else{
_this.$message.error(msg);
}
diff --git a/src/main/resources/static/vue/operation.js b/src/main/resources/static/vue/operation.js
index 818bb1e..c592e80 100644
--- a/src/main/resources/static/vue/operation.js
+++ b/src/main/resources/static/vue/operation.js
@@ -2,21 +2,29 @@ Vue.component('operation', {
template: `
- {{form.wsdl}}
+
+
+ 提交
+
+
+
+
+
+
-
-
-
+
+
@@ -33,6 +41,9 @@ Vue.component('operation', {
{{ data.fieldName }}
+
@@ -49,13 +60,13 @@ Vue.component('operation', {
- 返回参数
+ 返回参数
-
-
@@ -93,6 +104,7 @@ Vue.component('operation', {
return {
form: {
wsdl: '',
+ operationName: '',
input: {},
output: {}
},
@@ -103,7 +115,7 @@ Vue.component('operation', {
listTypes: ['java.util.List'],
textInputTypes: ['java.lang.String'],
numberInputTypes: ['java.math.BigDecimal','java.lang.Integer'],
- dateInputTypes: ['javax.xml.datatype.XMLGregorianCalendar'],
+ dateInputTypes: ['javax.xml.datatype.XMLGregorianCalendar','java.util.GregorianCalendar'],
booleanTypes: ['java.lang.Boolean']
}
},
@@ -118,11 +130,19 @@ Vue.component('operation', {
},
},
created(){
- this.onSubmit();
+ this.queryOperationInfo();
},
methods: { // 组件内方法
handleNodeClick(){},
- onSubmit(){
+ addListItem(node){
+ console.log(node)
+ if(node && node.fields){
+ var cp = JSON.parse(JSON.stringify(node.fields[0]));
+ cp.fieldName = node.fields.length;
+ node.fields.push(cp);
+ }
+ },
+ queryOperationInfo(){
var _this = this;
$.ajax({
type: 'GET',
@@ -136,13 +156,101 @@ Vue.component('operation', {
success: function ({code,data,msg}, textStatus, jqXHR) {
console.log(data)
_this.form.wsdl = data.wsdl;
- _this.form.input = data.input;
- _this.form.output = data.output;
+ _this.form.input = [data.input];
+ _this.form.output = [data.output];
+ _this.form.operationName = data.operation;
},
error: function (xhrJson,status,error) {
_this.$message.error(error);
}
});
+ },
+ onSubmit(){
+ // 获取参数
+ if(this.form.input){
+ console.log("this.form.input===========",this.form.input)
+ var body = this.form.input[0].fields?this.form.input[0].fields:this.form.input[0];
+ const request = (this.form.input[0] && this.form.input[0].genericType) ? [] : {};
+ this.generateRequest(request,body);
+ console.log('=====================================');
+ console.log(request);
+ var _this = this;
+ $.ajax({
+ type: 'POST',
+ url: '/invoke',
+ contentType:'application/json',
+ timeout: 5000,
+ data: JSON.stringify({
+ wsdl: _this.form.wsdl,
+ method: _this.form.operationName,
+ input: this.form.input[0],
+ output: this.form.output[0],
+ json: JSON.stringify(request)
+ }),
+ dataType: "JSON",
+ success: function ({code,data,msg}, textStatus, jqXHR) {
+ console.log(data)
+ if(code === 0){
+ _this.form.output = [data];
+ _this.$message.success(msg);
+ }else{
+ _this.$message.error(msg);
+ }
+ },
+ error: function (xhrJson,status,error) {
+ _this.$message.error(error);
+ }
+ });
+ }
+ },
+ generateRequest(root,input){
+ if(input instanceof Array){
+ for (var index in input){
+ this.generateRequest(root,input[index]);
+ }
+ }else{
+ // 判断进入的类型
+ if (this.checkType(input.typeName) === 'obj') {
+ var currentObj = {};
+ var key = input.fieldName;
+ if(root instanceof Array){
+ console.log('===========generateRequest===root:')
+ root.push(currentObj);
+ }else{
+ root[key] = currentObj;
+ }
+ if(input.fields && input.fields.length>0){
+ for (var index in input.fields){
+ this.generateRequest(currentObj,input.fields[index]);
+ }
+ }
+ } else if (this.checkType(input.typeName) === 'list') {
+ var currentList = [];
+ var key = input.fieldName;
+ root[key] = currentList;
+ if(input.fields && input.fields.length>0){
+ for (var index in input.fields){
+ this.generateRequest(currentList,input.fields[index]);
+ }
+ }
+ } else if (this.checkType(input.typeName) === 'base') {
+ root[input.fieldName] = input.value || '11';
+ }
+ }
+ },
+ checkType(typeName){
+ if(typeName === 'java.lang.String'
+ || typeName === 'java.math.BigDecimal'
+ || typeName === 'javax.xml.datatype.XMLGregorianCalendar'
+ || typeName === 'java.util.GregorianCalendar'
+ || typeName === 'java.lang.Integer'
+ ){
+ return 'base';
+ }else if(typeName === 'java.util.List'){
+ return 'list';
+ }else {
+ return 'obj';
+ }
}
}
})
\ No newline at end of file
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index 1f1a638..5786aa2 100644
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -103,6 +103,7 @@
@@ -120,7 +121,7 @@
:name="item.name"
size="small"
>
-
+
@@ -142,6 +143,7 @@
el: '#app',
data: {
loading: false,
+ projectsLoading: false,
defaultProps: {
children: 'children',
label: 'name'
@@ -179,6 +181,8 @@
},
queryProjects(){
var _this = this;
+ _this.projectsLoading = true;
+ _this.projectList = []
$.ajax({
type: 'POST',
url: '/query-projects',
@@ -187,13 +191,13 @@
data: JSON.stringify({}),
dataType: "JSON",
success: function ({code,data}, textStatus, jqXHR) {
- console.log(data)
if(data && code === 0){
_this.projectList = data;
}
+ _this.projectsLoading = false;
},
error: function (xhrJson,status,error) {
-
+ _this.projectsLoading = false;
}
});
},
diff --git a/src/test/java/com/lsh/TestCalendar.java b/src/test/java/com/lsh/TestCalendar.java
new file mode 100644
index 0000000..6e73f77
--- /dev/null
+++ b/src/test/java/com/lsh/TestCalendar.java
@@ -0,0 +1,15 @@
+package com.lsh;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+
+public class TestCalendar {
+ private XMLGregorianCalendar calendar;
+
+ public XMLGregorianCalendar getCalendar() {
+ return calendar;
+ }
+
+ public void setCalendar(XMLGregorianCalendar calendar) {
+ this.calendar = calendar;
+ }
+}
diff --git a/src/test/java/com/lsh/TestDTO.java b/src/test/java/com/lsh/TestDTO.java
new file mode 100644
index 0000000..47b3406
--- /dev/null
+++ b/src/test/java/com/lsh/TestDTO.java
@@ -0,0 +1,44 @@
+package com.lsh;
+
+import org.lsh.webservice.ui.entity.dto.ServerInfo;
+
+import java.util.List;
+
+public class TestDTO {
+ private String name;
+ private String value;
+ private String qOrE;
+ private List children;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ this.children = children;
+ }
+
+ public String getqOrE() {
+ return qOrE;
+ }
+
+ public void setqOrE(String qOrE) {
+ this.qOrE = qOrE;
+ }
+}
diff --git a/src/test/java/com/lsh/test.java b/src/test/java/com/lsh/test.java
new file mode 100644
index 0000000..66d0f72
--- /dev/null
+++ b/src/test/java/com/lsh/test.java
@@ -0,0 +1,23 @@
+package com.lsh;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.lsh.webservice.ui.entity.FormV2;
+import org.lsh.webservice.ui.utils.ExplainWebservice;
+
+public class test {
+ public static void main(String[] args) throws JsonProcessingException {
+ String [] arr = {
+ "http://10.30.35.155:8088/services/containerQueryWebService?wsdl",
+ "http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL",
+ "http://10.30.35.116:35180/services/queryPersonPostInfoWebService?wsdl",
+ "http://10.30.35.116:35180/services/itemSyncWebService?wsdl",
+ "http://10.30.35.59/weixin.asmx?WSDL",
+ "http://10.30.35.116:35180/services/okWebService?wsdl"
+ };
+ ObjectMapper objectMapper = new ObjectMapper();
+ FormV2 formV2 = ExplainWebservice.explainWsdlV2(arr[4]);
+ System.out.println(objectMapper.writeValueAsString(formV2));
+ System.out.println(formV2);
+ }
+}
diff --git a/src/test/java/com/lsh/test2.java b/src/test/java/com/lsh/test2.java
new file mode 100644
index 0000000..7f93d9a
--- /dev/null
+++ b/src/test/java/com/lsh/test2.java
@@ -0,0 +1,15 @@
+package com.lsh;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import javax.xml.ws.WebServiceClient;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.net.URL;
+
+public class test2 {
+ public static void main(String[] args) throws Exception {
+ URL wsdlUrl = new URL("http://10.30.35.116:35180/services/queryPersonPostInfoWebService?wsdl");
+
+ }
+}
diff --git a/src/test/java/com/lsh/test3.java b/src/test/java/com/lsh/test3.java
new file mode 100644
index 0000000..1dd1eca
--- /dev/null
+++ b/src/test/java/com/lsh/test3.java
@@ -0,0 +1,54 @@
+package com.lsh;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.reflect.TypeToken;
+import org.lsh.webservice.ui.entity.MyParameterizedType;
+import org.lsh.webservice.ui.entity.dto.ServerInfo;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+public class test3 {
+ public static void main(String[] args) throws JsonProcessingException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ String json = "[{\"bomDTO\":[{\"backFlush\":\"11\",\"bmeng\":\"11\",\"componentGbo\":\"11\",\"ebort\":\"11\",\"erpStep\":\"11\",\"menge\":\"11\",\"operation\":\"11\",\"qOrE\":\"11\",\"qty\":\"11\",\"reservedLine\":\"11\",\"reservedNumber\":\"11\",\"salesOrder\":\"11\",\"sequence\":\"11\",\"shopOrder\":\"11\",\"soLine\":\"11\",\"sumQty\":\"11\",\"unit\":\"11\"}],\"routingDTO\":[{\"description\":\"11\",\"erpControlKey\":\"11\",\"erpStep\":\"11\",\"manSeconds\":\"11\",\"manUnit\":\"11\",\"operation\":\"11\",\"sequence\":\"11\",\"shopOrder\":\"11\",\"staffQty\":\"11\",\"workCenter\":\"11\"}],\"shopOrderDTO\":{\"agingRatio\":\"11\",\"agingTime\":\"11\",\"agingVoltage\":\"11\",\"agingWay\":\"11\",\"baseSealRule\":\"11\",\"crestClampNum\":\"11\",\"deliveryDate\":\"2024-10-30\",\"demandPlant\":\"11\",\"demandQty\":\"11\",\"demandUser\":\"11\",\"erpStatus\":\"11\",\"fatherSo\":\"11\",\"hopeFinishTime\":\"2024-10-30\",\"innerBoxSeal\":\"11\",\"kdkg2\":\"11\",\"oriQty\":\"11\",\"outerBoxSeal\":\"11\",\"phosphorFatherSo\":\"11\",\"planNote\":\"11\",\"plannedCompDate\":\"2024-10-30\",\"plannedItem\":\"11\",\"plannedStartDate\":\"2024-10-30\",\"plannedWorkCenter\":\"11\",\"priorityNum\":\"11\",\"qtyOrdered\":\"11\",\"salesNote\":\"11\",\"salesOrder\":\"11\",\"salesOrderQuantity\":\"11\",\"salesman\":\"11\",\"shopOrder\":\"11\",\"shopOrderType\":\"11\",\"site\":\"11\",\"soItem\":\"11\",\"soLine\":\"11\",\"status\":\"11\",\"steelSealNum\":\"11\",\"stencilNum\":\"11\",\"stickerSealRule\":\"11\",\"supplyQty\":\"11\",\"switchingTime\":\"11\",\"targetLine\":\"11\",\"targetStorage\":\"11\",\"wbs\":\"11\",\"zext4\":\"11\",\"zrqyz10\":\"11\",\"zrqyz11\":\"11\",\"zrqyz5\":\"11\",\"zrqyz6\":\"11\",\"zrqyz7\":\"11\",\"zrqyz8\":\"11\",\"zrqyz9\":\"11\",\"zyp\":\"11\"}}]";
+ Gson gson = new Gson();
+
+ MyParameterizedType type = new MyParameterizedType(List.class, new Type[]{ShopOrderSyncDTO.class});
+
+// Type type = new TypeToken(ShopOrderSyncDTO.class.getTypeParameters()){}.getType();
+ List> deserializedList = gson.fromJson(json, type);
+ System.out.println(deserializedList);
+
+ JavaType javaType = objectMapper.getTypeFactory().constructCollectionType(List.class, ShopOrderSyncDTO.class);
+ List list2 = objectMapper.readValue(json, javaType);
+
+ System.out.println(list2);
+ System.out.println(ShopOrderSyncDTO.class.getGenericSuperclass());
+
+ }
+
+ public static XMLGregorianCalendar dateToXmlDate(Date date) {
+ GregorianCalendar gregorianCalendar = new GregorianCalendar();
+ gregorianCalendar.setTime(date);
+ try {
+ return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
+ } catch (DatatypeConfigurationException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+}