我正在使用请求有效负载中的对象数组调用API,我在@RequestBody上添加了@valid批注,以检查是否在我的有效负载中发送了任何null属性。我期望如果我发送的任何空数据都应该引发错误。但是我的代码没有抛出错误
以下是我的实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@DynamicUpdate
@Entity
@Table(name = "student")
public class Student {
@Id
@Column(name = "student_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer studentId;
@NotNull
@Column(name = "name")
private String name;
@NotNull
@Column(name = "gender")
private String gender;
}
这是我的控制器课程
@RestController
@CrossOrigin
public class StudentController {
@PostMapping("/class/{classId}/student")
public Student addStudent(@PathVariable Integer classId,@Valid @RequestBody List<Student>
student) {
// My logic Comes Here
return Student;
}
}
验证依赖性
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
我的请求有效载荷
[{
"name":"kiran",
"gender":"male"
},
{
"name":"divya"
}
]
当我发送上述有效载荷时,我希望抛出一个错误,因为我没有发送不为null的性别,但是spring不会抛出任何错误。
我想念一些让@valid工作的东西吗?
答案 0 :(得分:2)
您不能将@Valid
应用于java.util.List
答案 1 :(得分:2)
如果您使用Spring Boot 2.3.3.RELEASE。然后在POM中添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
使用示例:
//update audTipo
@PutMapping("audTipo/{id}")
public ResponseEntity<AudTipo> update(@PathVariable(value="id") Integer audTipoId,
@Valid @RequestBody AudTipo audTipoDetils) throws ResourceNotFundException
{
AudTipo audTipo = audTipoRepository.findById(audTipoId).orElseThrow(()-> new
ResourceNotFundException("NF " + audTipoId));
audTipo.setXdesc(audTipoDetils.getXdesc());
return ResponseEntity.ok(this.audTipoRepository.save(audTipo));
}
答案 2 :(得分:1)
例如,如果遇到以下问题:无法看到返回给客户端的验证错误(默认消息),则可以执行以下操作:
最佳解决方案1: 只需添加devtools。这应该可以解决问题。完成此操作后,我所有的绑定结果都返回给客户端。我建议您先进行测试:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
解决方案2:
我发现这是由于使用Spring Boot 2.3+ 因此,如果您使用的是Spring Boot 2.3或更高版本,请将此依赖项添加到pom.xml文件中,因为它不再包含在“ web”依赖项本身中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
现在有必要将 java / resources / application.properties 中的“包含绑定错误”设置为“始终”。 “消息”也一样,尽管我认为这是可选的。
server.error.include-message=always
server.error.include-binding-errors=always
解决方案3:(在我发现解决方案2可能同样有用之前)
所以我发现这是由于安装了Spring boot 2.3+。但是我在Spring Boot v2.3 +中找不到有关@Valid的新更新用法的警告消息。
因此,我最终通过调整pom.xml文件中的发行版来切换回Spring boot v2.2.10(2.2的最新版本):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
通过回滚到较早的版本,这对我来说非常理想。虽然id喜欢有一天要更新我的Spring Boot版本。 (重新访问解决方案1和2)
答案 3 :(得分:0)
您的@Valid
批注将应用于列表,而不应用于列表中的实际对象。
示例中的注释会验证列表,而不是列表中的每个对象。
尝试一下
public Student addStudent(@PathVariable Integer classId,@RequestBody List<@Valid Student> students)
您还可以指定其他参数,例如,您可能需要验证列表上的每个对象,并确保列表不为空或具有最小大小等。这些验证必须在列表上执行。 / p>
答案 4 :(得分:0)
当Spring Boot找到带有@Valid注释的参数时,它将自动引导默认的JSR 380实现—休眠验证器—并验证该参数。
仅当Request本身为NULL时,才会违反JSR 380实现。如上所述,它不能用于检查请求正文中的空值。
答案 5 :(得分:0)
我知道您正在使用构建的 Maven,但我遇到了类似的问题,即标签无法集成到构建的 Gradle 中。
我通过获取正确版本的依赖项解决了这个问题。
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Mute the music -->
<item android:id="@+id/mute_menu_item"
android:title="@string/mute_music"
app:showAsAction="always"
android:onClick="muteMusic"
/>
<!-- Restart menu item -->
<item
android:id="@+id/restart_menu_item"
android:icon="@drawable/light_bulb"
android:title="@string/restart"
app:showAsAction="never"
android:onClick="restartStory"
/>
代替
implementation 'org.springframework.boot:spring-boot-starter-validation:2.4.0'
如果有人知道这是否正确,但现在可以使用了。