一、修改ApiResponses
package com.crownboot.web.global.response;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.ServerHttpResponse;
public class ApiResponse<T> implements Serializable {
private static final long serialVersionUID = -1296644476749112463L;
public static ApiResponse<Void> success(HttpServletResponse response, int code) {
response.setStatus(code);
return SuccessResponse.<Void>builder().code(code).build();
}
public static <T> ApiResponse<T> success(T object) {
return success(HttpStatus.OK.value(), object);
}
public static <T> ApiResponse<T> success(int code, T object) {
return SuccessResponse.<T>builder().code(code).data(object).build();
}
public static <T> ApiResponse<T> success(HttpServletResponse response, T object) {
return SuccessResponse.<T>builder().code(HttpStatus.OK.value()).data(object).build();
}
public static <T> ApiResponse<T> success(HttpServletResponse response, int status, T object) {
response.setStatus(status);
return SuccessResponse.<T>builder().code(status).data(object).build();
}
public static <T> ApiResponse<T> success(ServerHttpResponse response, int status, T object) {
response.setStatusCode(org.springframework.http.HttpStatus.valueOf(status));
return SuccessResponse.<T>builder().code(status).data(object).build();
}
}
二、添加SuccessResponses
package com.crownboot.web.global.response;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
@Builder
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class SuccessResponse<T> extends ApiResponse<T> {
private static final long serialVersionUID = 1L;
@Builder.Default
private boolean success = true;
@Builder.Default
private int code = 200;
private T data;
}
三、添加FailedResponses 处理异常
package com.crownboot.web.global.response;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import cn.hutool.core.date.DatePattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
@Builder
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class FailedResponse<T> extends ApiResponse<T> {
private static final long serialVersionUID = 1L;
@Builder.Default
private boolean success = false;
@Builder.Default
private int code = 500;
private String message;
private String exception;
private String exceptionClazz;
@JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
private LocalDateTime time;
}
四、修改UserController
package com.gitee.example.controller;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.gitee.example.model.User;
import com.gitee.web.api.ApiResponses;
@RestController
@RequestMapping(value = "/users2")
public class UserController2 {
private static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
@GetMapping
public ApiResponses<List<User>> getUserList() {
List<User> r = new ArrayList<>(users.values());
return ApiResponses.success(r);
}
@PostMapping
public ApiResponses<String> postUser(@RequestBody User user) {
users.put(user.getId(), user);
return ApiResponses.success("新增成功");
}
@GetMapping("/{id}")
public ApiResponses<User> getUser(@PathVariable Long id) {
return ApiResponses.success(users.get(id));
}
@PutMapping("/{id}")
public ApiResponses<String> putUser(@PathVariable Long id, @RequestBody User user) {
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return ApiResponses.success("更新成功");
}
@DeleteMapping("/{id}")
public ApiResponses<String> deleteUser(@PathVariable Long id) {
users.remove(id);
return ApiResponses.success("删除成功");
}
}
五、修改单元测试
package com.gitee.example;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import com.gitee.Application;
import com.gitee.example.model.User;
import com.gitee.web.api.SuccessResponses;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ApplicationTests2 {
@Autowired
private MockMvc mvc;
@Test
public void testUserController2() throws Exception {
RequestBuilder request;
request = get("/users2/");
MvcResult result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
String content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<List<User>> response = JSONUtil.toBean(content, new TypeReference<SuccessResponses<List<User>>>() {}, true);
assertThat(response.getData().size(), is(0));
User puser = new User();
puser.setId(1L);
puser.setName("测试大师");
puser.setAge(20);
request = post("/users2/")
.contentType(MediaType.APPLICATION_JSON)
.content(JSONUtil.toJsonStr(puser));
result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<String> response1 = JSONUtil.toBean(content, new TypeReference<SuccessResponses<String>>() {}, true);
assertThat(response1.getData(), is("新增成功"));
request = get("/users2/");
result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<List<User>> response2 = JSONUtil.toBean(content, new TypeReference<SuccessResponses<List<User>>>() {}, true);
assertThat(response2.getData().size(), is(1));
puser.setName("测试终极大师");
puser.setAge(30);
request = put("/users2/1")
.contentType(MediaType.APPLICATION_JSON)
.content(JSONUtil.toJsonStr(puser));
result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<String> response3 = JSONUtil.toBean(content, new TypeReference<SuccessResponses<String>>() {}, true);
assertThat(response3.getData(), is("更新成功"));
request = get("/users2/1");
result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<User> response4 = JSONUtil.toBean(content, new TypeReference<SuccessResponses<User>>() {},true);
User user = response4.getData();
assertThat(user.getId(), is(1L));
assertThat(user.getName(), is("测试终极大师"));
request = delete("/users2/1");
result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<String> response5 = JSONUtil.toBean(content, new TypeReference<SuccessResponses<String>>() {}, true);
assertThat(response5.getData(), is("删除成功"));
request = get("/users2/");
result = mvc.perform(request)
.andExpect(status().isOk())
.andReturn();
content = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
SuccessResponses<List<User>> response6 = JSONUtil.toBean(content, new TypeReference<SuccessResponses<List<User>>>() {}, true);
assertThat(response6.getData().size(), is(0));
}
}
六、单元测试结果