报错原因是与这篇博客的内容相似,https://blog.csdn.net/caoyi1207/article/details/80606232
原因就是自定义的classloader默认的父classloader是appclassloader,需在MyOperationBuilderPlugin构造时指定正确的父classloader,本人做法是在MyOperationBuilderPlugin定义一个静态变量,在系统启动时主动设置
代码如下
public class MyOperationBuilderPlugin extends ClassLoader implements OperationBuilderPlugin {
public static ClassLoader pcl =null;
protected MyOperationBuilderPlugin() {
super(pcl);
}
@Autowired
private TypeResolver typeResolver;
// @Override
public void apply(OperationContext operationContext) {
try {
Field f=ClassLoader.class.getDeclaredField("classes");
f.setAccessible(true);
f.get(ClassLoader.getSystemClassLoader());
Vector classes=(Vector)f.get(ClassLoader.getSystemClassLoader());
System.out.print("");
}catch(Exception e) {
}
Map<String, Object> maps = SwaggerRetMapContext.getMap();
if(maps == null || maps.size() == 0){
return;
}
String requestMappingPatternName = operationContext.requestMappingPattern();
//if(operationContext.getReturnType().isInstanceOf(Map.class)) {
if(maps.get(requestMappingPatternName) != null){
//根据参数上的ApiJsonObject注解中的参数动态生成Class
Optional<ApiReturnJson> optional = operationContext.findAnnotation(ApiReturnJson.class);
try {
// Method method = Swagger2.class.getMethod("restApi");//系统默认取该处的全局变量
// ApiReturnJson apiReturnJson = method.getAnnotation(ApiReturnJson.class);
// String name = apiReturnJson.key()+"_"+operationContext.getName();
// if (optional.isPresent())
// name = optional.get().key(); //model 名称
ApiReturnJsonPro[] properties = (ApiReturnJsonPro[]) maps.get(requestMappingPatternName);
if(properties == null){
return;
}
String name = operationContext.getName() + requestMappingPatternName.replaceAll("/","_");
byte[] cs = SwaggerASMUtil.createRefModel(properties, name);
Class hw = this.defineClass(name, cs, 0, cs.length);
// hw.
ResolvedType rt = typeResolver.resolve(hw);
// 像documentContext的Models中添加我们新生成的Class
operationContext.getDocumentationContext().getAdditionalModels().add(rt);
//
Set<ResponseMessage> set = new HashSet<ResponseMessage>();
ModelRef mr = new ModelRef(name);
set.add(new ResponseMessage(200,
"{\"ret\":\"0\",\"desc\":\"success\",\"data\":{}}",
mr,null,null));
operationContext.operationBuilder().responseMessages(set);
// operationContext.operationModelsBuilder().addReturn(rt).build();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public boolean supports(DocumentationType documentationType) {
return true;
}
}
public class Swagger2DemoApplication {
public static void main(String[] args) {
//MyOperationBuilderPlugin.pcl=Thread.currentThread().getContextClassLoader();
User us=new User();
System.out.println("wxq 8888");
new SpringApplicationBuilder(Swagger2DemoApplication.class);
System.out.println("wxq 9999");
SpringApplication.run(Swagger2DemoApplication.class, args);
System.out.println("wxq 9999000");
}
}