spring模拟mvc执行post请求正文丢失:错误400

问题描述 投票:0回答:4

我尝试模拟 mvc 请求以在春季测试端到端我的控制器。

post 请求需要请求正文,但我收到错误 400,告诉我所需的请求正文丢失,即使我使用 MockMvcResultsHandler print 看到其正文。

项目架构:

  • 源代码
    • 主要
    • 测试
      • 应用程序.属性
      • 控制器
      • 服务

这是我的 application.properties

spring.datasource.url=jdbc:h2:mem:tesdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=*****
spring.datasource.password=*****
spring.jpa.show-sql = true

这是我的测试

@SpringBootTest
@AutoConfigureMockMvc
public class IntegrationTest {
    protected User mockUser;
  
    protected List<User> allUsers;

    @Autowired
    private MockMvc mvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @BeforeEach
    public void setUp() {
        this.mvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
    }
    
    @Test
    void testGetAllUsers() throws Exception {
        this.mvc.perform(post("/api/users")
        .accept(MediaType.APPLICATION_JSON)
        .contentType(MediaType.APPLICATION_JSON)
        .characterEncoding("utf-8")     
        .content("{\"name\":\"name\"}"))
        .andDo(print())
        .andExpect(status().isCreated());
   }
}

我的@RestController

    @PostMapping(path = "/users")
    public @ResponseBody ResponseEntity<User> addNewUser(
        @RequestBody String name        
    ) {
        return userService.createUser(name);
    }

和我的用户@Service

public ResponseEntity<User> createUser(String name) {
        User user = new User();
        user.setName(name);
        userRepository.save(user);

当我尝试启动测试时,我进入调试控制台

DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<java.lang.String> ....addNewType(java.lang.String,java.lang.Boolean)]

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/users
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=utf-8", Accept:"application/json", Content-Length:"32"]
             Body = {"name":"concat"}
    Session Attrs = {}

回复是:

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

当我使用相同的架构时,get 方法似乎可以工作,主体似乎出现在控制台中,但 serlt 似乎看不到/理解请求主体。

java spring spring-boot spring-mvc mockmvc
4个回答
1
投票

这是我真实的网络服务的简化示例。 问题来自于我在同一个请求中多次使用@RequestBody

public @ResponseBody ResponseEntity<User> addNewUser(
        @RequestBody String name ,
        @RequestBody String lastName,

这就是问题的根源。

为了解决这个问题,我创建了一个类似的 DTO

public @ResponseBody ResponseEntity<User> addNewUser(
        @RequestBody UserDTO userDto

现在工作正常


0
投票

美好的一天!

需要检查:

  • API 网址
  • 需要运行 spring 应用程序,以便测试方法能够调用 API 网址。

0
投票

尝试创建一个显式的 json,然后传入正文,也在你的控制器中,你需要一个字符串名称,尝试从 json 中获取它。 例如:

@Test
void testGetAllUsers() throws Exception {
    JSONObject json = new JSONObject();
    json.put("name", "john");
    this.mvc.perform(post("/api/users")
    .accept(MediaType.APPLICATION_JSON)
    .contentType(MediaType.APPLICATION_JSON)
    .characterEncoding("utf-8")     
    .content(json.toString())
    .andDo(print())
    .andExpect(status().isCreated()); }

在你的控制器中你可以尝试这样的事情

@PostMapping(path = "/users")
public @ResponseBody ResponseEntity<User> addNewUser(
    @RequestBody String name        
) {
    JSONObject json = new JSONObject(name);
    String userName = json.getString("name");
    return userService.createUser(userName);
}

0
投票

尝试在内容中发送的字符串上添加双引号 ("):

mvc.perform(post("/url")
                        .content("\"myName\"")
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk());
© www.soinside.com 2019 - 2024. All rights reserved.