You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中地点服务返回非JSON格式数据的解决求助

解决Quarkus中Location服务返回toString格式而非JSON的问题

我是Quarkus新手,正在开发基于Quarkus与PostgreSQL的小型应用,包含用户数据和地点数据两个微服务。用户数据服务可返回正确的JSON格式,但地点数据服务返回的是Location类toString输出的字符串格式。

示例对比

用户服务返回的正确JSON:

{
    "username": "mishamba",
    "publicName": "misha",
    "email": "misha.nenahov@gmail.com",
    "createdOn": "2022-08-28T19:03:53.537+00:00"
}

地点服务返回的错误格式:

Location(id=2, coordinate=(45.0, 50.0), title=fish store, description=Greatest fish store in city, graphicMaterialPath=null, address=Chargaly 79, creatorUsername=mishamba, createdOn=2022-09-05 17: 03: 20.910009, lastUpdateDate=null)

相关代码

Entity类代码:

@Entity
@RequiredArgsConstructor
@Table(name = "locations")
@Data
@EqualsAndHashCode
@ToString
@TypeDef(name = "psqlPoint", typeClass = PGPointUserType.class)
public class Location {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @NotNull
    @Column(name = "coordinate")
    @Type(type = "psqlPoint")
    private PGpoint coordinate;
    @NotNull
    private String title;
    private String description;
    @Column(name = "graphic_materials_path")
    @Type(type = "com.pointer.util.psql.type.GenericArrayUserType")
    private List<String> graphicMaterialPath;
    private String address;
    @NotNull
    @Column(name = "creator_username")
    private String creatorUsername;
    @Column(name = "creation_date")
    private Date createdOn;
    @Column(name = "last_update_date")
    private Date lastUpdateDate;
}

Endpoint代码:

@Path("/v1/locations")
@ApplicationScoped
@AllArgsConstructor
@Produces(value = "application/json")
public class LocationController {

private LocationService locationService;

@GET
@Path("/{locationId}")
public Response getLocationById(@PathParam("locationId") Integer locationId) {
    Location location = locationService.getLocation(locationId);
    return Response.ok(location).build();

...

解决步骤

1. 确认JSON序列化依赖

Quarkus默认依赖Jackson处理JSON序列化,需确保项目中已添加对应依赖:

  • Maven(RESTEasy Classic):
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
  • Maven(RESTEasy Reactive):
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>
  • Gradle(RESTEasy Classic):
implementation 'io.quarkus:quarkus-resteasy-jackson'
  • Gradle(RESTEasy Reactive):
implementation 'io.quarkus:quarkus-resteasy-reactive-jackson'

2. 自定义PGpoint序列化器

Jackson无法默认识别PGpoint类型,需编写自定义序列化器:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import org.postgresql.geometric.PGpoint;

public class PGpointSerializer extends JsonSerializer<PGpoint> {
    @Override
    public void serialize(PGpoint value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeNumberField("x", value.x);
        gen.writeNumberField("y", value.y);
        gen.writeEndObject();
    }
}

在Location类的coordinate字段上添加注解指定序列化器:

@NotNull
@Column(name = "coordinate")
@Type(type = "psqlPoint")
@JsonSerialize(using = PGpointSerializer.class)
private PGpoint coordinate;

3. 统一Date字段序列化格式(可选)

若要让Date字段输出与用户服务一致的ISO格式,可添加以下配置:

  • application.properties:
quarkus.jackson.serialization.write-dates-as-timestamps=false
quarkus.jackson.serialization.write-date-timestamps-as-nanoseconds=false

或者直接在Date字段上添加注解:

@Column(name = "creation_date")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private Date createdOn;

@Column(name = "last_update_date")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private Date lastUpdateDate;

4. 验证字段可访问性

Lombok的@Data注解已自动生成getter方法,Jackson依赖getter序列化字段,若存在字段无法访问的情况,需检查Lombok配置是否生效。

内容的提问来源于stack exchange,提问作者Mishamba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:05:22