Как я могу записать только длинное число в виде строки при вводе формы?

#java #spring-boot #hibernate #thymeleaf

#java #spring-boot #спящий режим #thymeleaf

Вопрос:

Я делаю регистрацию в Spring Boot, используя Spring Data JPA. Я столкнулся с проблемой размещения длинных значений в поле формы.

Класс модели: я использовал @NotBlank аннотацию раньше private long nsuID , но когда форма перенаправляет nsuID , поле заполняется на 0.

 @Entity
@Table(name="alumnies",uniqueConstraints = @UniqueConstraint(columnNames = "email") )
public class Alumni {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name="NSU_ID")
    @NotBlank
    private long nsuID;
    
    public long getNsuID() {
        return nsuID;
    }
    public void setNsuID(long nsuID) {
        this.nsuID = nsuID;
    }
    
}
  

HTML-файл:

 <div class="form-group"
    th:classappend="${#fields.hasErrors('nsuID')}? 'has-error':''">
    <label for="nsuID" class="control-label">NSU ID</label> <input
       id="nsuID" class="form-control" th:field="*{nsuID}" />
       <p class="error-message"
       th:each="error : ${#fields.errors('nsuID')}"
       th:text="${error}">Validation error</p>
     </div>
  

Класс контроллера:

 @Controller
public class RegistraionController {
    @Autowired
    private UserService us;
    
    @GetMapping("/")
    public String showRegistration(Model model) {
        Alumni alumni = new Alumni();
        model.addAttribute("alumni", alumni);
        return "registration";
    }
    
    @PostMapping("/registration")
    public String saveAlumni(@ModelAttribute("alumni") @Validated Alumni alumni, BindingResult bindingResult) {
        
        Alumni existing = us.findByEmail(alumni.getEmail());
        if (existing != null) {
            bindingResult.rejectValue("email", null, "There is already an account registered with that email");
        }
        
        if (bindingResult.hasErrors()) {
             return "registration";
          }
        us.saveAlumni(alumni);
        return "redirect:/";
    }
    

}
  

Ответ №1:

Как сказал @Dip Халани, переменная типа long не может содержать нулевое значение, поскольку это переменная примитивного типа, а значение переменной типа long по умолчанию равно 0.

И ваше @NotBlank ограничение на nsuID неверно, потому что оно проверяет, что урезанная длина последовательности символов не пуста, обычно она используется для проверки того, что заданное строковое значение должно быть не нулевым, а урезанная длина должна быть больше нуля.

Если вы хотите проверить наличие ненулевого значения, затем используйте @NotNull и замените long nsuID на Long nsuID .

Посмотрите разницу между ограничениями @NotNull, @NotEmpty и @NotBlank при проверке компонента

Ответ №2:

long не может содержать нулевые значения, поэтому может преобразовываться в 0. попробуйте изменить его на Long (класс-оболочка).

 @NotBlank 
private Long nsuID;