如何使用 Micronaut 启用 JsonView
How To Enable JsonView With Micronaut
截至这个问题,我已经获得了最新版本的 Micronaut (1.1.0),并且看到添加了对 @JsonView jackson 注释的支持。但是,当我将它添加到我的控制器并在我的 application.yml 中启用它时,我没有看到注释应用于响应,我仍然收到完整的对象。注意:我也将 Lombok 与我的 POJO 一起使用,但我不知道这是否会造成干扰。
控制器:
@Controller("/v1")
public class Controller {
private MongoClient client;
public Controller(MongoClient mongoClient) {
this.client = mongoClient;
}
@Get("/ids")
@Produces(MediaType.APPLICATION_JSON)
@JsonView(Views.IdOnly.class)
public Single<List<Grain>> getIdsByClientId(@QueryValue(value = "clientId") String clientId) {
return Flowable.fromPublisher(getCollection().find(Filters.eq("data.clientId", clientId))).toList();
}
private MongoCollection<Grain> getCollection() {
CodecRegistry grainRegistry = CodecRegistries.fromRegistries(MongoClients.getDefaultCodecRegistry(), CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));
return client
.getDatabase("db").withCodecRegistry(grainRegistry)
.getCollection("col", Data.class);
}
}
数据:
@Data
@NoArgsConstructor
public class Data {
@JsonSerialize(using = ToStringSerializer.class)
@JsonView(Views.IdOnly.class)
private ObjectId id;
private boolean active = true;
@Valid
@NotNull
private DataMeta dataMeta;
@Valid
@NotNull
private DataContent dataContent;
}
查看:
public class Views {
public static class IdOnly {
}
}
application.yml
---
micronaut:
application:
name: mojave-query-api
---
mongodb:
uri: "mongodb://${MONGO_USER:user}:${MONGO_PASSWORD:password}@${MONGO_HOST:localhost}:${MONGO_PORT:27017}/db?ssl=false&authSource=db"
---
jackson.json-view.enabled: true
application.yml(替代版本也不起作用)
---
micronaut:
application:
name: mojave-query-api
---
mongodb:
uri: "mongodb://${MONGO_USER:user}:${MONGO_PASSWORD:password}@${MONGO_HOST:localhost}:${MONGO_PORT:27017}/db?ssl=false&authSource=db"
---
jackson:
json-view:
enabled: true
我不确定我是否在 application.yml 文件中将 jackson 行放在了错误的位置,或者该功能是否没有按预期工作,或者我遗漏了一些完全不同的东西?输入赞赏!
最新版本 application.yml 是正确的,但是您忘记将您的数据 class 标记为 @JsonView class,所以工作版本是
@Data
@JsonView
@NoArgsConstructor
public class Data {
@JsonSerialize(using = ToStringSerializer.class)
@JsonView(Views.IdOnly.class)
private ObjectId id;
private boolean active = true;
@Valid
@NotNull
private DataMeta dataMeta;
@Valid
@NotNull
private DataContent dataContent;
}
截至这个问题,我已经获得了最新版本的 Micronaut (1.1.0),并且看到添加了对 @JsonView jackson 注释的支持。但是,当我将它添加到我的控制器并在我的 application.yml 中启用它时,我没有看到注释应用于响应,我仍然收到完整的对象。注意:我也将 Lombok 与我的 POJO 一起使用,但我不知道这是否会造成干扰。
控制器:
@Controller("/v1")
public class Controller {
private MongoClient client;
public Controller(MongoClient mongoClient) {
this.client = mongoClient;
}
@Get("/ids")
@Produces(MediaType.APPLICATION_JSON)
@JsonView(Views.IdOnly.class)
public Single<List<Grain>> getIdsByClientId(@QueryValue(value = "clientId") String clientId) {
return Flowable.fromPublisher(getCollection().find(Filters.eq("data.clientId", clientId))).toList();
}
private MongoCollection<Grain> getCollection() {
CodecRegistry grainRegistry = CodecRegistries.fromRegistries(MongoClients.getDefaultCodecRegistry(), CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));
return client
.getDatabase("db").withCodecRegistry(grainRegistry)
.getCollection("col", Data.class);
}
}
数据:
@Data
@NoArgsConstructor
public class Data {
@JsonSerialize(using = ToStringSerializer.class)
@JsonView(Views.IdOnly.class)
private ObjectId id;
private boolean active = true;
@Valid
@NotNull
private DataMeta dataMeta;
@Valid
@NotNull
private DataContent dataContent;
}
查看:
public class Views {
public static class IdOnly {
}
}
application.yml
---
micronaut:
application:
name: mojave-query-api
---
mongodb:
uri: "mongodb://${MONGO_USER:user}:${MONGO_PASSWORD:password}@${MONGO_HOST:localhost}:${MONGO_PORT:27017}/db?ssl=false&authSource=db"
---
jackson.json-view.enabled: true
application.yml(替代版本也不起作用)
---
micronaut:
application:
name: mojave-query-api
---
mongodb:
uri: "mongodb://${MONGO_USER:user}:${MONGO_PASSWORD:password}@${MONGO_HOST:localhost}:${MONGO_PORT:27017}/db?ssl=false&authSource=db"
---
jackson:
json-view:
enabled: true
我不确定我是否在 application.yml 文件中将 jackson 行放在了错误的位置,或者该功能是否没有按预期工作,或者我遗漏了一些完全不同的东西?输入赞赏!
最新版本 application.yml 是正确的,但是您忘记将您的数据 class 标记为 @JsonView class,所以工作版本是
@Data
@JsonView
@NoArgsConstructor
public class Data {
@JsonSerialize(using = ToStringSerializer.class)
@JsonView(Views.IdOnly.class)
private ObjectId id;
private boolean active = true;
@Valid
@NotNull
private DataMeta dataMeta;
@Valid
@NotNull
private DataContent dataContent;
}