Java 为什么我的请求没有';在Spring Boot中将json转换为模型对象

Java 为什么我的请求没有';在Spring Boot中将json转换为模型对象,java,spring-boot,unit-testing,Java,Spring Boot,Unit Testing,我想测试我的寄存器控制器,我得到了错误,bcz发布的数据没有转换到我的模型,测试落在验证上 @PostMapping(value = "/register", consumes = "application/json") @ResponseStatus(HttpStatus.CREATED) private String postRegistration( @ModelAttribute @Valid final UserCreateFormDto user, final Bi

我想测试我的寄存器控制器,我得到了错误,bcz发布的数据没有转换到我的模型,测试落在验证上

@PostMapping(value = "/register", consumes = "application/json")
    @ResponseStatus(HttpStatus.CREATED)
    private String postRegistration( @ModelAttribute @Valid final  UserCreateFormDto user, final BindingResult result,
                                    final RedirectAttributes redirectAttributes, final WebRequest webRequest) {
        if (result.hasErrors()) {
            redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.user", result);
            redirectAttributes.addFlashAttribute("user", user);
            return "redirect:/register";
        }
        if (userService.checkEmailExist(user.getEmail())) {
            return "redirect:/register?exist";
        }
        final User registered = userService.createNewUserAccount(user);

        try {
            final String appUrl = webRequest.getContextPath();
            eventPublisher.publishEvent(new RegistrationCompleteEvent(registered, webRequest.getLocale(), appUrl));
            return "redirect:/login?success";
        } catch (UserNotExistsException e) {
            return "redirect:/register";
        }
    }

和测试

@Test
    public void shouldReturnHttp201WhenUserIsCreated() throws Exception {
        //given
        final UserCreateFormDto userCreateFormDto = createUserCreateForm();
        final User user = createUser();

        given(userService.checkEmailExist(userCreateFormDto.getEmail())).willReturn(false);
        given(userService.createNewUserAccount(any(UserCreateFormDto.class))).willReturn(user);

        //when
        final MockHttpServletResponse response = mockMvc
                .perform(post("/register").with(csrf())
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(objectMapper.writeValueAsString(userCreateFormDto)))
                .andReturn()
                .getResponse();

        //then
        assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED.value());
        assertThat(response.getContentAsString()).isEqualTo(userJacksonTester.write(user).getJson());
        verify(userService).createNewUserAccount(refEq(userCreateFormDto));
    }

编辑
我试图模拟BindingResult,但在阅读更多内容后,这不是一个好主意。

您想绑定表单输入字段还是JSON正文。您的测试针对后者,而您的控制器针对前者。如果要使用主体而不是表单,请使用
@RequestBody
而不是
@modeldattribute
。我要绑定表单数据。我正在使用thymeleaf发布数据。因此,我的问题是如何将输入字段绑定到我的对象?然后不要使用
内容
,而是在请求中添加参数以用于绑定。就像表单一样,它工作得很好!谢谢你,我的朋友。你帮了我很多!您想绑定表单输入字段还是JSON正文。您的测试针对后者,而您的控制器针对前者。如果要使用主体而不是表单,请使用
@RequestBody
而不是
@modeldattribute
。我要绑定表单数据。我正在使用thymeleaf发布数据。因此,我的问题是如何将输入字段绑定到我的对象?然后不要使用
内容
,而是在请求中添加参数以用于绑定。就像表单一样,它工作得很好!谢谢你,我的朋友。你帮了我很多!