@JsonFormat()不起作用

Wesley13
• 阅读 579

    打算将数据库取出的Date类型的数据改成一定格式的时间,如改成yyyy-MM-dd。然后在属性的get方法上加了@JsonFormat,结果取出时一直是long类型的Date,代码如下:

package soc.entity;

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

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import com.fasterxml.jackson.annotation.JsonFormat;




//@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
/*@XmlRootElement
@XmlType(name = "user", propOrder = {
        "id",
        "name",
        "salary",
        "birthday"}
    )*/
public class User {
    private long id; 
    private String name;
    
    @Min(value=6000,message="最低工资为6000")
    @Max(value=25000,message="最高工资为25000")
    private Double salary;
    private Date birthday;
    
    
    public User() {
    }
    public User(long id, String name, Double salary, String birthday) {
        super();
        this.id = id;
        this.name = name;
        this.salary = salary;
        try {
            this.birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    public User(String name, Double salary, String birthday) {
        super();
        this.name = name;
        this.salary = salary;
        try {
            this.birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
    
    
//    @XmlJavaTypeAdapter(DateAdapter.class)//这种格式也可以<birthday>2018-10-15 10:12:15</birthday>
//    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")//json的返回格式
    @JsonFormat(pattern="yyyy/MM/dd HH:mm:ss",timezone = "GMT+8")//json的返回格式
    public Date getBirthday() {
        return birthday;
    }
    
    
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    
    
    @Override
    public String toString() {
        String birthdayS = (new SimpleDateFormat("yyyy-MM-dd")).format(birthday);
        return "User : id="+id+", Name="+name+", Salary="+salary+", Birthday="+birthdayS;
    }
}

配置类如下:

package soc.config;

import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.glassfish.jersey.filter.LoggingFilter;
//import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;

public class ApplicationApi extends ResourceConfig {
    public ApplicationApi() {

        // 注册数据转换器
        register(JacksonJsonProvider.class);

        // 注册日志
        register(LoggingFilter.class);

        // register application resources
        // register(UserResource.class);
        packages("soc.resource");

        // register filters
        register(RequestContextFilter.class);

        // register mine exception class ,to find the trace of exception
        register(DebugMapperException.class);

        // register features
        // register(JacksonFeature.class);
    }
}

经过一番查看,最后发现该配置类里的JacksonJsonProvider是

org.codehaus.jackson.jaxrs.JacksonJsonProvider

而实体User类上的注解@JsonFormat则是

com.fasterxml.jackson.annotation.JsonFormat

两者根本不是同一类型,将JacksonJsonProvider改成

com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider

则问题解决。

综上得出结论,用@JsonFormat注解时,json格式支持的jaxrs的实现类必须与该注解是同一个大类型,即fasterxml,jar包如下:

            <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.5.4</version>
        </dependency>

如果json格式支持的jaxrs的实现类是codehaus,则@JsonFormat注解不起作用,即不可以是如下jar包:

        <dependency> 
         <groupId>org.codehaus.jackson</groupId> 
         <artifactId>jackson-jaxrs</artifactId> 
        <version>1.9.13</version> 
        </dependency>
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java几秒前,几分钟前,几小时前,几天前,几月前,几年前的实现
package com.date;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class RelativeDateFormat {
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Stella981 Stella981
3年前
Flutter中日期组件DatePicker及组件汉化
Flutter提供了DatePicker组件进行时间选择。日期组件及时间组件代码示例:import'package:flutter/material.dart';//第三方插件,需要提前配置import'package:date_format/date_format.dart';classDat
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Easter79 Easter79
3年前
Swagger如何测试Date类型参数
问题Swagger测试时,参数直接输入日期格式化后的类型,会报参数日期转换错误:ConversionFailedException解决网上说在参数上添加注解@DateTimeFormat(pattern“yyyyMMdd”)或者是添加@JsonFormat(pattern”yyyyMMddHH:mm:
Stella981 Stella981
3年前
None of the configured nodes are available
1.今天写了一段ES的测试代码,如下:package elasticSearch;import java.net.InetSocketAddress;import java.util.ArrayList;import java.util.List;import java.util.M
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用