【问题标题】:Sending date to REST service in JSON以 JSON 格式向 REST 服务发送日期
【发布时间】:2018-04-03 17:36:58
【问题描述】:

我正在用 Java-EE 中的 REST 接口开发一个 CRUD 应用程序。

我有一些包含日期字段的实体。当我想使用请求正文中带有 JSON 的 POST 请求创建此类实体的实例时,jax-rs(或底层反序列化器)会抱怨解析日期部分。

这是我得到的例外:

Servlet.service() 用于 servlet service.JAXRSConfiguration 抛出 异常java.time.format.DateTimeParseException:文本'2011-11-11' 无法在索引 10 处解析

我试图在请求中发送这个:

{
    "title": "testTitle",
    "description": "testDescription",
    "playtime": 50,
    "creationDate": "2011-11-11"
}

我应该如何在 json 中定义日期以使其成功解析?哪种格式正确?

这里是实体类:

@Entity
@NamedQueries({
        @NamedQuery(name = "Movie.findAll", query = "SELECT m FROM Movie m")
})
public class Movie extends AbstractDao{

    private String title;

    private String description;

    @ManyToMany(mappedBy = "movies")
    private List<Actor> actors;

    @ManyToMany(mappedBy = "movies")
    private List<Director> directors;

    private int playtime;

    @OneToOne(cascade = CascadeType.PERSIST)
    private Trailer trailer;

    @Temporal(value = TemporalType.DATE)
    private Date creationDate;

getters,setters, etc

这里是 jax-rs 服务:

@Path("/movies")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MovieRestService {

    @Inject
    private MovieService movieService;

    @GET
    public List<Movie> getMovies(){
        return movieService.findAll();
    }

    @Path("{id}")
    @GET
    public Movie getMovie(@PathParam("id") long id){
        return movieService.findById(id);
    }

    @POST
    public Movie addMovie(Movie movie){
        return movieService.create(movie);
    }

    @Path("{id}")
    @PUT
    public Movie updateMovie(Movie movie, @PathParam("id") long id){
        return movieService.update(movie,id);
    }

    @Path("{id}")
    @DELETE
    public Movie deleteMovie(@PathParam("id") long id){
        return movieService.delete(id);
    }

}

【问题讨论】:

  • 其实我想我已经遇到过这个问题,但它是一个不同的场景 imo。
  • 你可以尝试将数据读取为 json 并查看你得到的格式吗?在 Java 端创建一些数据并尝试将其读取为 json。
  • 您可以尝试在日期字段中添加注释,如这个问题stackoverflow.com/questions/13803391/… 和@clinomaniac 提到的一个

标签: java json rest date jax-rs


【解决方案1】:

尝试使用如下的 DateAdapter (XmlAdapter):

并注释:

@XmlJavaTypeAdapter(DateAdapter.class)
private Date creationDate;

你也可以在creationDate的getter处进行注解

类:

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {
  private static final TimeZone UTC = TimeZone.getTimeZone("UTC");    
  private static final String PATTERN_T_WITH_SEC = "yyyy-MM-dd'T'HH:mm:ss";
  private SimpleDateFormat dateFormat = new impleDateFormat(PATTERN_T_WITH_SEC);

@Override
public String marshal(Date v) throws Exception {
    dateFormat.setTimeZone(UTC);
    String dateF = dateFormat.format(v);
    return dateF;
}

@Override
public Date unmarshal(String v) throws Exception {
    dateFormat.setTimeZone(UTC);
    Date date = dateFormat.parse(v);
    return date;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多