当前位置: 首页 > 知识库问答 >
问题:

云终结点不尊重Jackson注释

郭思淼
2023-03-14

我有一个班级组织,只有很少的date字段,如下所示。

public class Organization {

    private String _id;

    private String name;

    @JsonDeserialize(using=JsonDateDeserializer.class)
    @JsonSerialize(using=JsonDateSerializer.class)
    private Date createdTime;

// getters and setters

}

为了在客户端以简单的方式处理日期,我将date转换为long,并使用这些JsonSerializer将其发送给客户端,如下所示

public class JsonDateSerializer extends JsonSerializer<Date>{

    @Override
    public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
        gen.writeNumber(date.getTime());
    }

}

我有一个endpoint,它将执行get organization并像下面这样在响应映射中插入结果。

@ApiMethod(name="organization.get", path="organizations/{organizationId}", httpMethod=HttpMethod.GET)
public Map<String, Object> organizationDetails(@Named("organizationId") String organizationId){
    Organization org = DB.getOrganization("123");
    Map<String, Object> response = new HashMap<String, Object>();
    response.put("status", HttpServletResponse.SC_OK);
    response.put("success", true);
    response.put("entity", org);
    return response;
} 

但是我在客户端看到的最终结果JSON是

{
  "status" : 200,
  "entity" : [ {
    "_id" : "966a03b3-8e46-41ee-b330-6533409b2b4a",
    "name" : "POKURI",    
    "createdTime" : "2015-05-16T15:02:31.499+05:30"
  } ],
  "success" : true
}

这里的日期以某种形式出现,而不是很长。如果我使用JacksonObjectMapper转换相同的数据,而不使用云endpoint,我将以预期的方式得到响应。为什么云endpoint不尊重Jackson注释?有没有办法配置它?

注意:即使我观察到,如果您使用云终结点,long在客户端以字符串形式出现。我正在使用appEngine SDK 1.9.19

共有1个答案

商俊智
2023-03-14

不应该在endpoint中使用Jackson注释(如果使用,则必须使用重新打包的版本,而不是您自己的版本)。您可以使用@ApiResourceProperty@ApiTransform来做您想做的事情,这取决于您想要如何做。看到注释留档在这里。

关于long,由于浮点不精确,它被序列化为字符串——不可能使用double精确地表示long的所有值,这是JavaScript和JSON.parse将数字存储在中的内容,因此它始终作为字符串传输。我们的任何endpoint客户端库都会自动将它们转换为正确的数据类型。

 类似资料:
  • 我有两个实体 和 此映射: 最近增加了。 在运行应用程序时,应用程序崩溃,错误是:通过JDBC语句执行DDL“alter table documents add debt__idbigint not null”时出错 我检查了Hibernate发送到数据库的sql查询,它是:更改表文档添加debt_idbigint不null 此查询失败,因为表上已经有记录,因此无法添加不带默认值的不可为空列。 那

  • 我希望将concur严格用作配置源。我正在使用spring cloud Consor配置来获取配置。我正在使用git2consul将文件加载到Consor并读取它们。根据spring云文档,我在构建中添加了以下内容。格拉德尔 并在我的application.properties 我面临的问题是,预期的属性没有加载到ConfigurationProperties bean中。在ConsultProp

  • 问题内容: 在纯Java SE 6环境中: Eclipse控制台中未显示任何内容。 l.info(“”) 及以上的作品就好了,但低于任何 罚款 只是似乎没有工作。有什么问题吗?TIA。 问题答案: 即使Logger级别设置为ALL,ConsoleHandler(记录器上的默认Handler)仍然具有INFO的默认级别。这来自 JAVA_HOME / jre / lib中 的默认logging.pr

  • 我正在使用本课程中的一个(稍加修改的)变通方法来获取userId,如果请求是从Android客户端发送的,则userId为空。 但我无法获取用户ID。 这个变通方法已经在其他项目中完美地工作了,所以问题一定在其他地方。My endpoints api使用以下范围、客户和受众进行了注释: 和是相同的。我没有使用web客户端,但Google告诉我添加web客户端ID。这个客户端id是否需要指定重定向U

  • 如何注册一个新用户,而不通过管理员,keycloak提供了一个界面来注册一个新的用户URL,以便直接在浏览器中注册新用户: http://localhost:8080/auth/realms/myrealm/login-行动/注册?客户id=clientid 但我找不到注册的rest API的endpoint。我成功地使用admin rest API添加了一个用户,但我想注册一个新用户,但不提及a

  • 我已经设置了Spark结构流(Spark 2.3.2)来阅读Kafka(2.0.0)。如果消息在Spark流作业开始之前进入主题,我无法从主题的开始消费。Spark streaming会忽略在初始运行Spark Stream作业之前产生的Kafka消息(即使使用。选项(“StratingoffSets”、“reasly”)),这是否是预期的Spark streaming行为? > 在开始流作业之前