Java 是否有方法根据值列表(来自@configurationproperties)验证@RequestHeader
我是Spring的新手,我正在使用一个API,它接收一个国家字符串作为标题。我想验证字符串是否是我们使用@Valid注释支持的国家之一 目前,我们正在使用HandlerInterceptorAdapter来实现这一点,但为了提高性能,我们希望改变这种方法。是否有一种优雅的方法来验证控制器中的此标头 更具体地说,验证需要获得配置的属性列表,并检查标题国家/地区是否在列表中 比如说:Java 是否有方法根据值列表(来自@configurationproperties)验证@RequestHeader,java,spring,Java,Spring,我是Spring的新手,我正在使用一个API,它接收一个国家字符串作为标题。我想验证字符串是否是我们使用@Valid注释支持的国家之一 目前,我们正在使用HandlerInterceptorAdapter来实现这一点,但为了提高性能,我们希望改变这种方法。是否有一种优雅的方法来验证控制器中的此标头 更具体地说,验证需要获得配置的属性列表,并检查标题国家/地区是否在列表中 比如说: @PutMapping(path = "/endpoint", consumes = Media
@PutMapping(path = "/endpoint", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.ACCEPTED)
public ResponseEntity<Void> createObject(@RequestBody @Valid final MyRequest myRequest,
@ApiParam(value = ApiConstants.COUNTRY_HEADER, required = true) @RequestHeader(ApiConstants.COUNTRY_HEADER) @ValidCountry final String country) {
// call the service
return ResponseEntity.status(HttpStatus.ACCEPTED).build();
}
@PutMapping(path=“/endpoint”,consumes=MediaType.APPLICATION\u JSON\u VALUE,products=MediaType.APPLICATION\u JSON\u VALUE)
@响应状态(HttpStatus.ACCEPTED)
public ResponseEntity createObject(@RequestBody@Valid final MyRequest MyRequest,
@ApiParam(value=ApiConstants.COUNTRY_头,required=true)@RequestHeader(ApiConstants.COUNTRY_头)@ValidCountry最终字符串国家){
//呼叫服务
返回ResponseEntity.status(HttpStatus.ACCEPTED.build();
}
如果没有正确设置所有部件,Spring会给JSR303验证工作带来困难。我认为问题不在于请求头,而在于某个地方的配置。我在这里提供了一个如何配置基于注释的配置的最小示例
演示控制器
@Validated
@RestController
public class DemoController {
@GetMapping(path = "/endpoint")
public String createObject(@RequestHeader @ValidCountry String country) {
return "OK\n";
}
}
验证器类(将验证器作为内部类使其更干净)
我会回来的
将失败。实施自定义验证,请参见。例如,我曾尝试实施自定义验证,例如,实施ConstraintValidator,但它不起作用。您的尝试如何,因此我们可能会帮助您找出缺少的内容以使其起作用。
@Target({TYPE, FIELD, ANNOTATION_TYPE, ElementType.PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = ValidCountry.CountryValidator.class)
public @interface ValidCountry {
String message() default "Bad country";
Class<? extends Payload>[] payload() default {};
Class<?>[] groups() default {};
public static class CountryValidator
implements ConstraintValidator<ValidCountry, String> {
@Override
public boolean isValid(String value,
ConstraintValidatorContext context) {
return null!= value && value.length() > 1;
}
}
}
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
curl -H "country: fi" http://localhost:8080/endpoint
curl -H "country: f" http://localhost:8080/endpoint