Skip to content

Commit 83d7a76

Browse files
committed
fix: add generate exception global handler
1 parent ebae62e commit 83d7a76

File tree

7 files changed

+40
-17
lines changed

7 files changed

+40
-17
lines changed

boot/src/main/java/com/reajason/javaweb/boot/api/GlobalExceptionHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.reajason.javaweb.boot.api;
22

3+
import com.reajason.javaweb.GenerationException;
34
import lombok.extern.slf4j.Slf4j;
45
import org.springframework.http.HttpStatus;
56
import org.springframework.http.ResponseEntity;
@@ -22,10 +23,16 @@ public ResponseEntity<?> handleNoResourceException() {
2223
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
2324
}
2425

26+
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
27+
@ExceptionHandler(GenerationException.class)
28+
public ErrorResponse handleGenerationException(GenerationException exception) {
29+
return new ErrorResponse(exception.getMessage());
30+
}
31+
2532
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
2633
@ExceptionHandler(Throwable.class)
2734
public ErrorResponse handleThrowable(Throwable throwable) {
28-
log.error("请求出错", throwable);
35+
log.error("Internal Exception", throwable);
2936
return new ErrorResponse(throwable.getMessage());
3037
}
3138
}

generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.reajason.javaweb.memshell;
22

3+
import com.reajason.javaweb.GenerationException;
34
import com.reajason.javaweb.memshell.config.InjectorConfig;
45
import com.reajason.javaweb.memshell.config.ShellConfig;
56
import com.reajason.javaweb.memshell.config.ShellToolConfig;
@@ -21,7 +22,7 @@ public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig in
2122
String serverName = shellConfig.getServer();
2223
AbstractServer server = ServerFactory.getServer(serverName);
2324
if (server == null) {
24-
throw new IllegalArgumentException("Unsupported server: " + serverName);
25+
throw new GenerationException("Unsupported server: " + serverName);
2526
}
2627

2728
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
@@ -39,7 +40,7 @@ public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig in
3940
} else {
4041
Pair<Class<?>, Class<?>> shellInjectorPair = server.getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType());
4142
if (shellInjectorPair == null) {
42-
throw new UnsupportedOperationException(serverName + " unsupported shell type: " + shellConfig.getShellType() + " for tool: " + shellConfig.getShellTool());
43+
throw new GenerationException(serverName + " unsupported shell type: " + shellConfig.getShellType() + " for tool: " + shellConfig.getShellTool());
4344
}
4445
Class<?> shellClass = shellInjectorPair.getLeft();
4546
injectorClass = shellInjectorPair.getRight();

generator/src/main/java/com/reajason/javaweb/memshell/generator/CustomShellGenerator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.reajason.javaweb.memshell.generator;
22

33
import com.reajason.javaweb.ClassBytesShrink;
4+
import com.reajason.javaweb.GenerationException;
45
import com.reajason.javaweb.asm.ClassRenameUtils;
56
import com.reajason.javaweb.memshell.config.CustomConfig;
67
import com.reajason.javaweb.memshell.config.ShellConfig;
@@ -23,7 +24,7 @@ public byte[] getBytes() {
2324
String shellClassBase64 = shellToolConfig.getShellClassBase64();
2425

2526
if (StringUtils.isBlank(shellClassBase64)) {
26-
throw new IllegalArgumentException("Custom shell class is empty");
27+
throw new GenerationException("Custom shell class is empty");
2728
}
2829
byte[] classBytes = Base64.getDecoder().decode(shellClassBase64);
2930
byte[] bytes = ClassRenameUtils.renameClass(classBytes, shellToolConfig.getShellClassName());

generator/src/main/java/com/reajason/javaweb/probe/ProbeMethod.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.reajason.javaweb.probe.generator.DnsLogGenerator;
66
import com.reajason.javaweb.probe.generator.SleepGenerator;
77
import com.reajason.javaweb.probe.generator.response.ResponseBodyGenerator;
8+
import lombok.SneakyThrows;
89

910
import java.lang.reflect.Constructor;
1011

@@ -25,14 +26,11 @@ public enum ProbeMethod {
2526
this.configClass = configClass;
2627
}
2728

29+
@SneakyThrows
2830
public byte[] generateBytes(ProbeConfig probeConfig, ProbeContentConfig probeContentConfig) {
29-
try {
30-
Constructor<? extends ShellGenerator> constructor =
31-
generatorClass.getConstructor(ProbeConfig.class, configClass);
32-
ShellGenerator generator = constructor.newInstance(probeConfig, configClass.cast(probeContentConfig));
33-
return generator.getBytes();
34-
} catch (Exception e) {
35-
throw new RuntimeException("shell generate failed: " + e.getMessage(), e);
36-
}
31+
Constructor<? extends ShellGenerator> constructor =
32+
generatorClass.getConstructor(ProbeConfig.class, configClass);
33+
ShellGenerator generator = constructor.newInstance(probeConfig, configClass.cast(probeContentConfig));
34+
return generator.getBytes();
3735
}
3836
}

generator/src/main/java/com/reajason/javaweb/probe/generator/DnsLogGenerator.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.reajason.javaweb.probe.generator;
22

3+
import com.reajason.javaweb.GenerationException;
34
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
45
import com.reajason.javaweb.probe.ProbeContent;
56
import com.reajason.javaweb.probe.config.DnsLogConfig;
@@ -12,6 +13,7 @@
1213
import net.bytebuddy.ByteBuddy;
1314
import net.bytebuddy.asm.Advice;
1415
import net.bytebuddy.dynamic.DynamicType;
16+
import org.apache.commons.lang3.StringUtils;
1517

1618
import static net.bytebuddy.matcher.ElementMatchers.named;
1719

@@ -27,6 +29,9 @@ public DnsLogGenerator(ProbeConfig probeConfig, DnsLogConfig probeContentConfig)
2729

2830
@Override
2931
protected DynamicType.Builder<?> build(ByteBuddy buddy) {
32+
if (StringUtils.isBlank(probeContentConfig.getHost())) {
33+
throw new GenerationException("DNSLog probeShell host must be specified");
34+
}
3035
ProbeContent detectContent = probeConfig.getProbeContent();
3136
switch (detectContent) {
3237
case Server:
@@ -42,7 +47,7 @@ protected DynamicType.Builder<?> build(ByteBuddy buddy) {
4247
.field(named("host")).value(probeContentConfig.getHost())
4348
.visit(Advice.to(JdkProbe.class).on(named("getJdk")));
4449
default:
45-
throw new UnsupportedOperationException(detectContent + " not supported");
50+
throw new GenerationException(detectContent + " not supported");
4651
}
4752
}
4853
}

generator/src/main/java/com/reajason/javaweb/probe/generator/SleepGenerator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.reajason.javaweb.probe.generator;
22

3+
import com.reajason.javaweb.GenerationException;
34
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
45
import com.reajason.javaweb.probe.ProbeContent;
56
import com.reajason.javaweb.probe.config.ProbeConfig;
@@ -10,6 +11,7 @@
1011
import net.bytebuddy.ByteBuddy;
1112
import net.bytebuddy.asm.Advice;
1213
import net.bytebuddy.dynamic.DynamicType;
14+
import org.apache.commons.lang3.StringUtils;
1315

1416
import static net.bytebuddy.matcher.ElementMatchers.named;
1517

@@ -28,13 +30,19 @@ public SleepGenerator(ProbeConfig probeConfig, SleepConfig probeContentConfig) {
2830
protected DynamicType.Builder<?> build(ByteBuddy buddy) {
2931
ProbeContent detectContent = probeConfig.getProbeContent();
3032
if (ProbeContent.Server.equals(detectContent)) {
33+
if (probeContentConfig.getSeconds() <= 0) {
34+
throw new GenerationException("sleepProbe seconds must be greater than 0");
35+
}
36+
if (StringUtils.isEmpty(probeContentConfig.getServer())) {
37+
throw new GenerationException("sleepProbe server must be specified");
38+
}
3139
return buddy.redefine(SleepServer.class)
3240
.name(CommonUtil.generateShellClassName())
3341
.visit(TargetJreVersionVisitorWrapper.DEFAULT)
3442
.field(named("server")).value(probeContentConfig.getServer())
3543
.field(named("seconds")).value(probeContentConfig.getSeconds())
3644
.visit(Advice.to(ServerProbe.class).on(named("getServer")));
3745
}
38-
throw new UnsupportedOperationException("Sleep Probe not supported for " + detectContent);
46+
throw new GenerationException("sleepProbe not supported for " + detectContent);
3947
}
4048
}

generator/src/main/java/com/reajason/javaweb/probe/generator/response/ResponseBodyGenerator.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.reajason.javaweb.probe.generator.response;
22

3+
import com.reajason.javaweb.GenerationException;
34
import com.reajason.javaweb.Server;
45
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
56
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
@@ -35,9 +36,11 @@ protected DynamicType.Builder<?> build(ByteBuddy buddy) {
3536
if (probeContentConfig.getReqParamName() != null) {
3637
name = probeContentConfig.getReqParamName();
3738
getDataFromReqInterceptor = getDataFromReqParamInterceptor.class;
38-
} else {
39+
} else if(probeContentConfig.getReqHeaderName() != null) {
3940
name = probeContentConfig.getReqHeaderName();
4041
getDataFromReqInterceptor = getDataFromReqHeaderInterceptor.class;
42+
}else{
43+
throw new GenerationException("responseBody probeShell must set headerName or paramName");
4144
}
4245
Class<?> writerClass = getWriterClass();
4346
Class<?> runnerClass = getRunnerClass();
@@ -58,7 +61,7 @@ private Class<?> getRunnerClass() {
5861
case Bytecode:
5962
return ByteCodeProbe.class;
6063
default:
61-
throw new IllegalArgumentException("responseBody not supported for probe content: " + probeConfig.getProbeContent());
64+
throw new GenerationException("responseBody not supported for probe content: " + probeConfig.getProbeContent());
6265
}
6366
}
6467

@@ -86,7 +89,7 @@ private Class<?> getWriterClass() {
8689
case Server.Apusic:
8790
return ApusicWriter.class;
8891
default:
89-
throw new IllegalArgumentException("responseBody now supported for server: " + probeContentConfig.getServer());
92+
throw new GenerationException("responseBody not supported for server: " + probeContentConfig.getServer());
9093
}
9194
}
9295

0 commit comments

Comments
 (0)