0

问题是当我尝试使用 post man 请求添加新记录时,有时会 因违反预期行为而违反一个或多个 Bean 验证约束@PresentOrFuture:这一定不会发生,因为给定日期总是new Date()

请求正文

{
    "objective": "test",
    "title": "test"
}

回复

{
    "path": "creation_date",
    "message": "creation date must be future or present.",
    "value": "2021-03-26T11:06:32.708Z[UTC]"
}

代码:


import javax.persistence.*;
import javax.validation.constraints.FutureOrPresent;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;

@Entity
@Table(name = "TODO")
public class Todo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long id;

    @Size(min = 3, max = 20, message = "it must be at least 3 and max 20 chars.")
    String title;

    @NotNull(message = "objective can't be empty.")
    String objective;

    @FutureOrPresent(message = "creation date must be future or present.")
    Date creation_date;

    boolean completed;


    Date completed_at;

    public Todo() {
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getObjective() {
        return objective;
    }

    public void setObjective(String objective) {
        this.objective = objective;
    }

    public Date getCreation_date() {
        return creation_date;
    }

    public void setCreation_date(Date creation_date) {
        this.creation_date = creation_date;
    }

    public boolean isCompleted() {
        return completed;
    }

    public void setCompleted(boolean completed) {
        this.completed = completed;
    }

    public Date getCompleted_at() {
        return completed_at;
    }

    public void setCompleted_at(Date completed_at) {
        this.completed_at = completed_at;
    }

    @PrePersist
    private void initCreationDate(){
        this.creation_date = new Date();
    }
}


import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import java.util.Date;
import java.util.List;

public class TodoDAO implements CrudDAO<Todo> {

    @PersistenceContext(unitName = "PU")
    EntityManager em;

    @Override
    public List<Todo> getAll() {
        return em.createQuery("select t from Todo t").getResultList();
    }

    @Override
    public Todo getById(Long id) {
        Todo foundTodo = em
                .createQuery("select t from Todo t where t.id = :pId", Todo.class)
                .setParameter("pId", id)
                .getSingleResult();
        if(foundTodo == null){
            throw new EntityNotFoundException("there is no Todo with id" + id);
        }else{
            return foundTodo;
        }
    }

    @Override
    public Todo create(Todo entity) {
        em.persist(entity);
        return entity;
    }

    @Override
    public Todo update(Todo entity) {

        Todo foundTodo = getById(entity.getId());

        if (foundTodo != null && entity.completed) {
            // not null and completed
            foundTodo.setCompleted(true);
            foundTodo.setCompleted_at(new Date());
        } else if (foundTodo != null && !entity.completed) {
            // not null not completed
            foundTodo.setCompleted(false);
            foundTodo.setCompleted_at(null);
        } else {
            // null with any
            throw new EntityNotFoundException("there is no todo with title " + entity.getTitle());
        }
        em.merge(foundTodo);
        return foundTodo;
    }

    @Override
    public Todo delete(Todo entity) {
        em.remove(entity);
        return entity;
    }

    @Override
    public Todo deleteById(Todo entity) {
        return null;
    }
}
package tariq.abdulghani.hello.todo;

import javax.ejb.Stateless;
import javax.inject.Inject;
import java.util.List;

@Stateless
public class TodoRepository {

    @Inject
    TodoDAO todoDAO;

    public List<Todo> getAll(){
        return todoDAO.getAll();
    }

    public Todo getById(Long id){
        return todoDAO.getById(id);
    }

    public Todo create(Todo todo){
        return todoDAO.create(todo);
    }

    public Todo update(Todo todo){
        return todoDAO.update(todo);
    }

    public Todo delete(Todo todo){
        return todoDAO.delete(todo);
    }
}


import javax.ejb.EJB;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;

@Path("todo")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class TodoResource {
    @EJB
    TodoRepository todoRepository;

    @GET
    public List<Todo> getALl(){
        return todoRepository.getAll();
    }

    @GET
    @Path("{id}")
    public Todo getALl(@PathParam("id") Long id){
        return todoRepository.getById(id);
    }

    @POST
    public  Todo create(Todo todo){
        return todoRepository.create(todo);
    }

    @DELETE
    public  Todo delete(Todo todo){
        return todoRepository.delete(todo);
    }
}

4

0 回答 0