如何在实例化时修改或更新 POJO 模型 Java Spring Webflux
How to modify or update POJO models at instantiating Java Spring Webflux
我正在为 Java 使用 Google 地图地理编码 API。我有一个基本地址 POJO。我想要做的是 运行 createLatCord 方法 lat 属性 与 地址、城市、州和邮政编码
我不知道我还应该在哪里修改,在 model 本身,Controller 或 Service/Repository?
方法我需要在创建时 运行 纬度 属性
private double createLatCord() throws InterruptedException, ApiException, IOException {
GeoApiContext context = new
GeoApiContext.Builder().apiKey("abc").build();
GeocodingResult[] results = GeocodingApi.geocode(context, address+city+state+zipcode).await();
// Gson gson = new GsonBuilder().setPrettyPrinting().create();
return results[0].geometry.location.lat;
}
型号:
// all the imports ...
public class User {
private String address;
private String zipcode;
private String city;
private String state;
private double lat; // <-- Run createLatCord method on this property
@Id
private String id;
public User() {
}
public User(String address, String zipcode, String city, String state, double lat) throws InterruptedException, ApiException, IOException {
this.address = address;
this.city = city;
this.state = state;
this.zipcode = zipcode;
this.lat = lat;
}
// GETTERS AND SETTERS HERE FOR THE ABOVE
// Leaving it out cause it's alot
}
控制器:
@PostMapping(path = "", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Mono<User> createUser(@RequestBody Mono<User> user) {
return userService.createUser(user);
}
服务/存储库:
@Override
public Mono<User> createUser(Mono<User> userMono) {
return reactiveMongoOperations.save(userMono);
}
解决方案:
型号:
public Mono<User> createLatCord(User user) throws InterruptedException, ApiException, IOException {
GeoApiContext context = new GeoApiContext.Builder().apiKey("elnjvw").build();
GeocodingResult[] results = GeocodingApi.geocode(context, user.getAddress() + user.getCity() + user.getState() + user.getZipcode()).await();
user.setLat(results[0].geometry.location.lat);
user.setLng(results[0].geometry.location.lng);
return Mono.just(user);
}
服务/存储库
@Override
public Mono<User> createUser(Mono<User> userMono) {
return userMono.flatMap(user -> {
try {
return reactiveMongoOperations.save(
user.createLatCord(user));
} catch (InterruptedException | ApiException | IOException e) {
e.printStackTrace();
}
return Mono.just(user);
});
}
如果我没猜错,你想在保存用户时更新纬度。由于您的服务已经收到一个 Mono,您可以对其进行平面映射以调用 google api,然后调用存储库。
它将是这样的:
@Override
public Mono<User> createUser(Mono<User> userMono) {
return userMono.flatMap(user ->
methodToCallGoogleApiAndSetValueToUser(user))
.subscribe(reactiveMongoOperations::save)
}
有一点是 methodToCallGoogleApiAndSetValueToUser 应该 return 具有更新用户的 Mono。
希望这对您有所帮助!
我正在为 Java 使用 Google 地图地理编码 API。我有一个基本地址 POJO。我想要做的是 运行 createLatCord 方法 lat 属性 与 地址、城市、州和邮政编码
我不知道我还应该在哪里修改,在 model 本身,Controller 或 Service/Repository?
方法我需要在创建时 运行 纬度 属性
private double createLatCord() throws InterruptedException, ApiException, IOException {
GeoApiContext context = new
GeoApiContext.Builder().apiKey("abc").build();
GeocodingResult[] results = GeocodingApi.geocode(context, address+city+state+zipcode).await();
// Gson gson = new GsonBuilder().setPrettyPrinting().create();
return results[0].geometry.location.lat;
}
型号:
// all the imports ...
public class User {
private String address;
private String zipcode;
private String city;
private String state;
private double lat; // <-- Run createLatCord method on this property
@Id
private String id;
public User() {
}
public User(String address, String zipcode, String city, String state, double lat) throws InterruptedException, ApiException, IOException {
this.address = address;
this.city = city;
this.state = state;
this.zipcode = zipcode;
this.lat = lat;
}
// GETTERS AND SETTERS HERE FOR THE ABOVE
// Leaving it out cause it's alot
}
控制器:
@PostMapping(path = "", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Mono<User> createUser(@RequestBody Mono<User> user) {
return userService.createUser(user);
}
服务/存储库:
@Override
public Mono<User> createUser(Mono<User> userMono) {
return reactiveMongoOperations.save(userMono);
}
解决方案:
型号:
public Mono<User> createLatCord(User user) throws InterruptedException, ApiException, IOException {
GeoApiContext context = new GeoApiContext.Builder().apiKey("elnjvw").build();
GeocodingResult[] results = GeocodingApi.geocode(context, user.getAddress() + user.getCity() + user.getState() + user.getZipcode()).await();
user.setLat(results[0].geometry.location.lat);
user.setLng(results[0].geometry.location.lng);
return Mono.just(user);
}
服务/存储库
@Override
public Mono<User> createUser(Mono<User> userMono) {
return userMono.flatMap(user -> {
try {
return reactiveMongoOperations.save(
user.createLatCord(user));
} catch (InterruptedException | ApiException | IOException e) {
e.printStackTrace();
}
return Mono.just(user);
});
}
如果我没猜错,你想在保存用户时更新纬度。由于您的服务已经收到一个 Mono,您可以对其进行平面映射以调用 google api,然后调用存储库。 它将是这样的:
@Override
public Mono<User> createUser(Mono<User> userMono) {
return userMono.flatMap(user ->
methodToCallGoogleApiAndSetValueToUser(user))
.subscribe(reactiveMongoOperations::save)
}
有一点是 methodToCallGoogleApiAndSetValueToUser 应该 return 具有更新用户的 Mono。
希望这对您有所帮助!