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
相关产品推荐
相关产品推荐

