Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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 如何在持久化但忽略HTTP请求之前启用Springbean验证_Java_Spring Boot_Bean Validation - Fatal编程技术网

Java 如何在持久化但忽略HTTP请求之前启用Springbean验证

Java 如何在持久化但忽略HTTP请求之前启用Springbean验证,java,spring-boot,bean-validation,Java,Spring Boot,Bean Validation,这是我的设想 B类{ @NotNull 字符串x; } 甲级{ @有效的 B B; @NotNull 弦y; } 现在,我的Http POST请求获得一个class A的对象作为有效负载字符串y应该在传入的HTTP请求中进行验证(并且在持久化到DB之前进行验证)。但是,String x不应在传入的HTTP请求中进行验证(并且仅在持久化到DB之前进行验证),因为String x将在请求中为空,并且在持久化完整的class A对象之前,其值将由业务逻辑设置 有什么方法可以做到这一点吗?我认为您缺

这是我的设想

B类{
@NotNull
字符串x;
}
甲级{
@有效的
B B;
@NotNull
弦y;
} 
现在,我的Http POST请求获得一个
class A
的对象作为有效负载<代码>字符串y应该在传入的HTTP请求中进行验证(并且在持久化到DB之前进行验证)。但是,
String x
不应在传入的HTTP请求中进行验证(并且仅在持久化到DB之前进行验证),因为
String x
将在请求中为空,并且在持久化完整的
class A
对象之前,其值将由业务逻辑设置


有什么方法可以做到这一点吗?

我认为您缺少将在控制器层验证的参数上添加@Vaild注释

@RestController
public class AController {

    @PostMapping("/a")
    ResponseEntity<String> addA(@Valid @RequestBody A a) {
        // persisting the a entity 
        return ResponseEntity.ok("A is valid");
    }
}
@RestController
公共类控制器{
@邮戳(“/a”)
ResponseEntity addA(@Valid@RequestBody A){
//持久化实体的属性
返回响应。ok(“A有效”);
}
}

如果可以编辑这些对象,则可以使用验证组

class B {
    @NotNull(groups = Ignored.class)
    String x;
}

class A {
    @Valid
    B b;

    @NotNull
    String y;
} 
其中,
被忽略

import javax.validation.groups.Default;

public interface Ignored extends Default {
}
import org.springframework.validation.annotation.Validated;

@Validated
public class Validator {

    public void validateA(@Valid A a) {
        // nothing here
    }
}
如果您的控制器未定义该组,则该组下的任何注释都将被忽略,因此您的要求将得到满足,请求中的
B.x
验证将被忽略,但
A
的其他字段将被验证。但我不是100%确定验证是否会应用于db端,您能试试吗

否则你可以试着去做

@RestController
public class Controller {

    @PostMapping("/etc")
    ResponseEntity<String> addA(@RequestBody A a) { //disabled validation here
        B tempB = a.getB();
        a.setB(null);
        validateA(a);
        a.setB(tempB);
        // continue logic
    }
}

这是一个丑陋的解决方案,但仍然是一个解决方案…

事实上,如果“@Valid”注释没有在参数前面加前缀,它不会产生影响,@Jonathan解释道

要在持久化之前启用验证,其工作方式如下:

@Repository
@Validated
public MyDao {
    public void insertA(@Valid A a){
        //logic here
    }

}
@Validated(org.springframework.validation.annotation.Validated)是启用参数验证的关键。它对我有用