gpt4 book ai didi

Spring HATEOAS 递归表示模型处理器?

转载 作者:行者123 更新时间:2023-12-04 12:00:27 28 4
gpt4 key购买 nike

我有一个关于 Spring HATEOAS 的表示模型处理器的问题。我们正在尝试在将模型序列化给客户端之前对其进行处理。我们的用例是丰富 imageUrl领域UserModel对象在运行时,因为我们必须根据来自配置 bean 的值构建 URL(AWS S3 存储桶 URL 因 DEV/PROD 设置而异)。

@Data
public class UserModel {
// ...
private String imageUrl;
}
因此,我们创建了一个 UserProcessor实现这一点:
public class UserProcessor implements RepresentationModelProcessor<EntityModel<UserModel>> {

private final ConfigAccessor configAccessor;

public UserProcessor(ConfigAccessor configAccessor) {
this.configAccessor = configAccessor;
}

@Override
public EntityModel<UserModel> process(EntityModel<UserModel> model) {
if (model.getContent() != null)
// do the enrichment and set "imageUrl" field
}
return model;
}
}
如果我们有这样的 Controller 方法,这非常有效:
@ResponseBody
@GetMapping("/me")
public EntityModel<UserModel> getCurrentUser(@AuthenticationPrincipal Principal principal) {
UserModel user = ... // get user model
return EntityModel.of(user);
}
然而,每当 UserModel 时,我们现在都在与浓缩作斗争。在另一个模型类中引用,例如 BookModel :
@Data
public class BookModel {
private String isbn;
// ...
private EntityModel<UserModel> user; // or "private UserModel user;"
}
Controller 方法返回类型 EntityModel<BookModel>仅将处理器应用于其类型,而不应用于引用的类型。似乎处理器不是递归应用的。
这是故意的还是我们做错了什么?
感谢您的任何意见和帮助,
迈克尔

最佳答案

我遇到了同样的问题,我通过手动组装资源解决了这个问题,在你的情况下,这将实现 BookModel 的 RepresentationModelAssembler,然后在书中的 userModel 对象上手动调用处理器。
使外部资源成为表示模型
首先考虑 BookModel 扩展 RepresentationModel 以便您可以手动添加链接和组装内部资源(您希望为 EntityModel 对象)

@Data
public class BookModel extends RepresentationModel<BookModel> {...}
编写模型汇编程序
现在编写一个汇编程序,它接受您的书实体并将其转换为表示模型或这些模型的集合。您将在此处自动实现 EntityModel.of(...) 为您执行的操作。
@Component
public class BookModelAssembler implements RepresentationModelAssembler<Book, BookModel> {

@Autowired
private UserProcessor userProcessor;

@Override
public BookModel toModel(Book entity) {
var bookModel = new BookModel(entity) // map fields from entity to model
// Transform the user entity to an entity model of user
var user = entity.getUser();
EntityModel<UserModel> userModel = EntityModel.of(user);
userModel = userProcessor.process(userModel);

bookModel.setUserModel(userModel);

return bookModel;
}
}
我可能会犹豫不决,但我想这是因为当 MVC 端点返回具有注册处理器的类型时,处理器会被调用,而在嵌入类型的情况下,不会调用该类型。我的推理基于 RepresentationModelProcessor 的文档,它指出处理器处理从 Spring MVC Controller 返回的表示模型。

关于Spring HATEOAS 递归表示模型处理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62754166/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com