前段时间我也在为同样的问题苦苦挣扎,some solutions 包括对生成的文件进行后处理。
但是,出于安全考虑,将 MongoDB 模型暴露给 API 可能并不完全正确。一个有趣的方法是简单地使用 Mappers 并将 DTO 概念应用于自动生成的模型类。
例如:
假设您在 MongoDB 中有一个 users 集合,以及一个用于检索用户的 API。
components:
schemas:
User:
type: object
properties:
id:
type: string
name:
type: string
Swagger 自动生成的类是这样的:
package api;
@ApiModel()
@Validated
public class User {
@JsonProperty("id")
private String id = null;
@JsonProperty("name")
private String name = null;
}
您还将拥有“标准”用户模型类:
package model;
@Document(collection = "users")
public class User {
@Id
private String id;
@NotNull
private String name;
@NotNull
private String password;
}
例如,请注意密码字段不包含在 API 定义中。
然后我们将拥有典型的用户存储库:
public interface UserRepository extends MongoRepository<User, String> { }
现在我们必须实现映射器,使用MapStruct 非常简单:
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper {
api.User map(model.User user);
}
您可以广泛自定义映射哪些信息以及如何映射信息。
唯一剩下的是控制器:
@Controller
public class MyController implements MyApi {
@Inject
UserMapper mapper;
@Autowired
private UserRepository repository;
@GetMapping("/api/v1.0/users")
public ResponseEntity<List<api.User>> getAllUsers() {
List<api.User> users = new ArrayList<>();
repository.findAll().forEach(user -> users.add(mapper.map(user)));
return new ResponseEntity(users, HttpStatus.OK);
}