当前位置: 首页 > 知识库问答 >
问题:

在java spring中添加对年龄字段异常的自定义验证

宋飞文
2023-03-14
@Entity
@Table(name = "students")
public class Student {

    @NotNull
    @Column(name = "age")
    @Positive
    @Digits(fraction = 0, integer = 10, message ="add a digit msg")
    private int age;

    // more codes below
}

控制器

package com.crudtest.demo.controller;

import com.crudtest.demo.model.Student;
import com.crudtest.demo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/api")
public class StudentController {

   @Autowired
   private StudentService studentService;

   @PostMapping("/students")
    public ResponseEntity<Student> createStudent(@Valid @RequestBody Student student) {
    Student stud = studentService.create(student);
    return new ResponseEntity<>(stud, HttpStatus.CREATED);
 }
}

服务

@Service
public class StudentService {

  @Autowired
  private StudentRepository studentRepository;

  public Student create(Student student) {
     return studentRepository.save(student);
  }
}

储存库

@Repository
public interface StudentRepository extends JpaRepository<Student, Long> 
{}

我还尝试在这里添加自定义注释:

package //
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD) // inside field
@Retention(RetentionPolicy.RUNTIME)
public @interface AgeValidation {
   String message() default "Age must be a number and not greater than 200.";

  Class<?>[] groups() default {};

  public abstract Class<? extends Payload>[] payload() default {};
}

class AgeValidationInterface implements ConstraintValidator<AgeValidation, Integer> {

  @Override
  public boolean isValid(Integer age, ConstraintValidatorContext constraintValidatorContext) {
    return age > 0 && age < 200;
  }
}

并且还更新了

//Student.java
@AgeValidation
private int age;

但同样的错误结果。

如何使用自定义验证对此进行验证?

共有1个答案

巫马翰翮
2023-03-14

这不起作用的原因与Spring试图将发布的有效负载反序列化为具体对象(即student)时(通过Jackson)进行的类型转换有关。

您的有效负载应该包含符合反序列化条件的“1”1(因为它们是有效数字)。提供的字符串不是有效的数字表示形式,因此进程失败,出现未处理的异常,从而导致“空白”响应。

您需要确保提供的JSON有效负载格式良好,并且有处理意外异常的好方法。

 类似资料:
  • 我正在使用wordpress 4.1与ACF v4。我有一个添加了自定义字段的自定义帖子类型,每次添加新类别时都需要添加新的自定义字段。如果我自动添加类别“轿车”,我必须添加自定义字段“轿车”。我可以使用插件函数执行此操作吗?或者我必须用代码,在数据库中插入来做到这一点?提前致谢!!

  • 我正在尝试添加一个自定义字段到忍者表单(第3.3节)。到处都找不到完整的例子。 仔细查看代码,似乎过滤器'ninja_forms_register_fields'可以起到作用,但我无法让它在任何地方运行。

  • 问题内容: 我创建了一个,并希望添加一个不属于我的模型的自定义字段。 我在此处找到了添加其他字段的说明,并尝试了以下操作: 当我添加此字段并调用我的函数时,则此字段不是字典的一部分。包含所有指定的模型字段,除了额外的字段。因此,我无法在覆盖的验证中访问此字段,可以吗? 当我将此字段添加到字段列表中时,如下所示: 然后我得到一个错误,因为它不是我的模型的一部分-正确的是因为我只想为此序列化器添加它。

  • 我有一个简单的签名方法来签署工作正常的PDF文档,它使用显示名称、位置、日期和原因的默认戳记来签署文档。 现在我的经理问我是否可以在上面再添加一个字段。让我们假设这是一个“电子邮件”字段,因为我还没有被告知他们想要什么。 我试着搜索并应用我找到的一些东西,但没有任何效果。 此外,有人问我是否可以删除/隐藏这4个默认字段的标签(日期、原因等...),我无法管理这样做,也找不到任何关于它的东西,我不知

  • 我正在尝试将添加到 Devise,但是当我注册一个新用户时,当我推送提交时它会中断。 我已确保运行< code>rake db:migrate并重新启动了我的服务器,但我得到了以下错误: ActiveRecord::StatementInvalid in Devise::RegistrationsController#create NoMethodError: nil:NilClass 的未定义方

  • 我正在尝试根据是否已选中自定义复选框向签出添加费用。我真的很接近让这项工作,但我有问题获得后的价值观,以确定是否应申请或不收费。 以下是我自定义字段的代码: 这是可行的,而且字段显示得非常完美。 在我的主题中form-checkout.php的底部,我添加了以下javascript,以在检查字段时更新购物车总数: 这将更新订单总数并运行以下代码(这就是问题所在): 我知道这部分被调用是因为如果我去