问题是当我尝试使用 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);
}
}