Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有方法根据值列表(来自@configurationproperties)验证@RequestHeader_Java_Spring - Fatal编程技术网

Java 是否有方法根据值列表(来自@configurationproperties)验证@RequestHeader

Java 是否有方法根据值列表(来自@configurationproperties)验证@RequestHeader,java,spring,Java,Spring,我是Spring的新手,我正在使用一个API,它接收一个国家字符串作为标题。我想验证字符串是否是我们使用@Valid注释支持的国家之一 目前,我们正在使用HandlerInterceptorAdapter来实现这一点,但为了提高性能,我们希望改变这种方法。是否有一种优雅的方法来验证控制器中的此标头 更具体地说,验证需要获得配置的属性列表,并检查标题国家/地区是否在列表中 比如说: @PutMapping(path = "/endpoint", consumes = Media

我是Spring的新手,我正在使用一个API,它接收一个国家字符串作为标题。我想验证字符串是否是我们使用@Valid注释支持的国家之一

目前,我们正在使用HandlerInterceptorAdapter来实现这一点,但为了提高性能,我们希望改变这种方法。是否有一种优雅的方法来验证控制器中的此标头

更具体地说,验证需要获得配置的属性列表,并检查标题国家/地区是否在列表中

比如说:

@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