首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MethodValidationPostProcessor时Spring返回404

使用MethodValidationPostProcessor时Spring返回404
EN

Stack Overflow用户
提问于 2020-09-30 23:20:07
回答 1查看 634关注 0票数 0

我的测试Spring应用程序有问题。它工作得很好,但是当我通过添加依赖项等并添加一个@Configuration来启用Spring验证时

代码语言:javascript
运行
复制
@Configuration
public class TestConfiguration {

  @Bean
  public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
  }
}

我的测试端点得到404。

代码语言:javascript
运行
复制
{
    "timestamp": 1601507037178,
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/test"
}

我已经从类似的问题(如herehere)中应用了一些解决方案/建议,但没有成功。

这是我的代码:https://github.com/zolv/error-handling-test

API接口:

代码语言:javascript
运行
复制
@Validated
public interface TestApi {

  @PostMapping(
      value = "/test",
      produces = {"application/json"},
      consumes = {"application/json"})
  @ResponseBody
  ResponseEntity<TestEntity> getTest(@Valid @RequestBody(required = false) TestEntity request);
}

TestEntity只是为了发送一些东西:

代码语言:javascript
运行
复制
@Data
public class TestEntity {
  @JsonProperty("test")
  @NotNull
  private String test;
}

主计长实现:

代码语言:javascript
运行
复制
@RestController
@RequiredArgsConstructor
@Validated
public class TestController implements TestApi {
  @Override
  @ResponseBody
  public ResponseEntity<TestEntity> getTest(@Valid @RequestBody TestEntity request) {
    return ResponseEntity.ok(request);
  }
}

我的主计长建议:

代码语言:javascript
运行
复制
@ControllerAdvice
public class DefaultErrorHandlerAdvice extends ResponseEntityExceptionHandler {

  @ExceptionHandler(value = {ConstraintViolationException.class})
  @ResponseStatus(value = HttpStatus.BAD_REQUEST)
  @ResponseBody
  public ResponseEntity<String> handleValidationFailure(ConstraintViolationException ex) {
    StringBuilder messages = new StringBuilder();

    for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
      messages.append(violation.getMessage());
    }

    return ResponseEntity.badRequest().body(messages.toString());
  }

  @Override
  @ResponseBody
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  protected ResponseEntity<Object> handleMethodArgumentNotValid(
      MethodArgumentNotValidException ex,
      HttpHeaders headers,
      HttpStatus status,
      WebRequest request) {
    return ResponseEntity.status(HttpStatus.BAD_REQUEST)
        .contentType(MediaType.APPLICATION_PROBLEM_JSON)
        .body("problem");
  }
}

应用程序:

代码语言:javascript
运行
复制
@SpringBootApplication
@EnableWebMvc
@ComponentScan(basePackages = "com.test")
public class TestApplication {

  public static void main(String[] args) {
    SpringApplication.run(TestApplication.class, args);
  }
}

我使用的测试,但也失败了使用邮递员:

代码语言:javascript
运行
复制
@SpringJUnitConfig
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class TestControllerTest {

  @Autowired protected TestRestTemplate restTemplate;

  @Test
  void registrationHappyPath() throws Exception {
    /*
     * Given
     */
    final TestEntity request = new TestEntity();

    /*
     * When/
     */
    final ResponseEntity<String> response =
        restTemplate.postForEntity("/test", request, String.class);

    /*
     * Then
     */
    Assertions.assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode());

    final String body = response.getBody();
    Assertions.assertNotNull(body);
  }
}

如果我注释掉一个TestConfiguration,那么一切都很好。提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 03:51:48

您应该设置MethodValidationPostProcessor#setProxyTargetClass(true),因为默认情况下,MethodValidationPostProcessor使用JDK代理,这会导致控制器在Spring上下文中丢失。

AbstractHandlerMethodMapping#processCandidateBean被调用时,isHandler(Class<?> beanType)将返回false,因为JDK代理不包含@RestController注释。

代码语言:javascript
运行
复制
  public MethodValidationPostProcessor methodValidationPostProcessor() {
    MethodValidationPostProcessor mvProcessor = new MethodValidationPostProcessor();
    mvProcessor.setProxyTargetClass(true);
    return mvProcessor;
  }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64147036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档