首页 > 解决方案 > 如何将日期类型参数作为字符串放入 GET 请求中?格式“yyyy-MM-dd”

问题描述

这是我的用户实体

package org.scd.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.scd.model.security.Role;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Entity
@Table(name = "USERS")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "FIRST_NAME", nullable = false, length = 45)
    private String firstName;

    @Column(name = "LAST_NAME", nullable = false, length = 45)
    private String lastName;

    @Column(name = "EMAIL", nullable = false, unique = true, length = 45)
    private String email;

    @Column(name = "PASSWORD", nullable = false, length = 256)
    private String password;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles = new HashSet<>(0);

    @OneToMany(mappedBy = "user",
        fetch = FetchType.EAGER
    )
    private List<Position> positions;

    public User() {
    }

    public User(String firstName, String lastName, String email, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Position> getPositions() {
        return positions;
    }

    public void setPositions(List<Position> positions) {
        this.positions = positions;
    }

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty("password")
    public String getHiddenPassword() {
        return "****";
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

这是我的职位实体

    package org.scd.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.time.LocalDate;
import java.util.Date;

@Entity
@Table(name = "POSITIONS")
public class Position {
    @Id
    @GeneratedValue(strategy =GenerationType.IDENTITY)
    private Long id;


    @Column(name = "START_DATE", nullable = false)
    private LocalDate creationDate;

    @Column(name = "LATITUDE", nullable = false, length = 45)
    private String latitude;

    @Column(name = "LONGITUDE", nullable = false, length = 45)
    private String longitude;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id", nullable = false, updatable = false)
    @JsonIgnore
    private User user;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Position )) return false;
        return id != null && id.equals(((Position) o).getId());
    }

    @Override
    public int hashCode() {
        return 31;
    }

    public Position() {

    }

    public Position(LocalDate creationDate, String latitude, String longitude, User user) {
        this.creationDate = creationDate;
        this.latitude = latitude;
        this.longitude = longitude;
        this.user = user;
    }

    public Long getId() {
        return id;
    }

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

    public LocalDate getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(LocalDate creationDate) {
        this.creationDate = creationDate;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

这是不起作用的 GET 请求。我只能将 startDate 和 endDate 作为字符串发送,但我需要它们采用日期格式。

@GetMapping(path = "/byUserIdAndTimePeriod/{userId}/{startDate}/{endDate}")
    public ResponseEntity<List<Position>> getPositionByUserAndTimePeriod(@PathVariable Long userId, @PathVariable  Date startDate, @PathVariable Date endDate) {
        return new ResponseEntity<>(new ArrayList<Position>(positionService.getPositionByUserAndTimePeriod(userId,startDate,endDate)),HttpStatus.OK);
    }

这是有效的更新 GET 请求

@GetMapping(path = "/byUserIdAndTimePeriod/{userId}/{startDate}/{endDate}")
public ResponseEntity<List<Position>> getPositionByUserAndTimePeriod(@PathVariable Long userId,
                                                                     @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
                                                                     @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) {
    return new ResponseEntity<>(new ArrayList<Position>(positionService.getPositionByUserAndTimePeriod(userId,startDate,endDate)),HttpStatus.OK);
}

这里是定位服务

 @Override
public List<Position> getPositionByUserAndTimePeriod(Long userId, LocalDate startDate, LocalDate endDate) {
    User user = new User();
    user.setId(userId);
    return positionRepository.findAllByUserAndCreationDateBetween(user,startDate,endDate);
}

这是位置存储库

List<Position> findAllByUserAndCreationDateBetween(User user, LocalDate startDate, LocalDate endDate);

你对我应该如何解决这个问题有什么想法吗?

GET 请求应该是什么样子?我应该在服务或其他地方修改一些东西吗?

谢谢你的时间。

标签: javamysqlspring

解决方案


您必须将@DateTimeFormat(pattern="yyy-MM-dd")注释添加到参数:

    @GetMapping(path = "/byUserIdAndTimePeriod/{userId}/{startDate}/{endDate}")
        public ResponseEntity<List<Position>> getPositionByUserAndTimePeriod(@PathVariable Long userId, 
                @PathVariable Date startDate, 
                @PathVariable @DateTimeFormat(pattern="yyy-MM-dd") Date endDate) {
            return new ResponseEntity<>(new ArrayList<Position>(positionService.getPositionByUserAndTimePeriod(userId,startDate,endDate)),HttpStatus.OK);
        }

推荐阅读