Skip to content

Commit edb2935

Browse files
朱晔朱晔
authored andcommitted
完善一下APIResponse的例子,兼容String作为返回值以及处理404错误
1 parent c787a93 commit edb2935

File tree

4 files changed

+33
-1
lines changed

4 files changed

+33
-1
lines changed

src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/APIResponseAdvice.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.geekbang.time.commonmistakes.apidesign.apiresponse;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.SneakyThrows;
35
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.annotation.Autowired;
47
import org.springframework.core.MethodParameter;
58
import org.springframework.core.annotation.AnnotationUtils;
69
import org.springframework.http.MediaType;
@@ -9,13 +12,16 @@
912
import org.springframework.http.server.ServerHttpResponse;
1013
import org.springframework.web.bind.annotation.ExceptionHandler;
1114
import org.springframework.web.bind.annotation.RestControllerAdvice;
15+
import org.springframework.web.servlet.NoHandlerFoundException;
1216
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
1317

1418
import javax.servlet.http.HttpServletRequest;
1519

1620
@RestControllerAdvice
1721
@Slf4j
1822
public class APIResponseAdvice implements ResponseBodyAdvice<Object> {
23+
@Autowired
24+
private ObjectMapper objectMapper;
1925

2026
//自动处理APIException,包装为APIResponse
2127
@ExceptionHandler(APIException.class)
@@ -28,6 +34,16 @@ public APIResponse handleApiException(HttpServletRequest request, APIException e
2834
return apiResponse;
2935
}
3036

37+
@ExceptionHandler(NoHandlerFoundException.class)
38+
public APIResponse handleException(NoHandlerFoundException ex) {
39+
log.error(ex.getMessage(), ex);
40+
APIResponse apiResponse = new APIResponse();
41+
apiResponse.setSuccess(false);
42+
apiResponse.setCode(4000);
43+
apiResponse.setMessage(ex.getMessage());
44+
return apiResponse;
45+
}
46+
3147
//仅当方法或类没有标记@NoAPIResponse才自动包装
3248
@Override
3349
public boolean supports(MethodParameter returnType, Class converterType) {
@@ -37,13 +53,20 @@ public boolean supports(MethodParameter returnType, Class converterType) {
3753
}
3854

3955
//自动包装外层APIResposne响应
56+
@SneakyThrows
4057
@Override
4158
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
4259
APIResponse apiResponse = new APIResponse();
4360
apiResponse.setSuccess(true);
4461
apiResponse.setMessage("OK");
4562
apiResponse.setCode(2000);
4663
apiResponse.setData(body);
47-
return apiResponse;
64+
if (body instanceof String) {
65+
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
66+
return objectMapper.writeValueAsString(apiResponse);
67+
} else {
68+
return apiResponse;
69+
}
70+
4871
}
4972
}

src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/APIResponseController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ public OrderInfo server(@RequestParam("userId") Long userId) {
5959
return new OrderInfo("Created", 2L);
6060
}
6161

62+
@GetMapping("server2")
63+
public String server2(@RequestParam("userId") Long userId) {
64+
return userId + "OK";
65+
}
66+
6267
@GetMapping("client")
6368
@NoAPIResponse
6469
public String client(@RequestParam(value = "error", defaultValue = "0") int error) {

src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/CommonMistakesApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.geekbang.time.commonmistakes.apidesign.apiresponse;
22

3+
import org.geekbang.time.commonmistakes.common.Utils;
34
import org.springframework.boot.SpringApplication;
45
import org.springframework.boot.autoconfigure.SpringBootApplication;
56

67
@SpringBootApplication
78
public class CommonMistakesApplication {
89

910
public static void main(String[] args) {
11+
Utils.loadPropertySource(CommonMistakesApplication.class, "config.properties");
1012
SpringApplication.run(CommonMistakesApplication.class, args);
1113
}
1214
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
spring.mvc.throw-exception-if-no-handler-found=true
2+
spring.resources.add-mappings=false

0 commit comments

Comments
 (0)