如何在实例化时修改或更新 POJO 模型 Java Spring Webflux

How to modify or update POJO models at instantiating Java Spring Webflux

我正在为 Java 使用 Google 地图地理编码 API。我有一个基本地址 POJO。我想要做的是 运行 createLatCord 方法 lat 属性地址、城市、州和邮政编码

我不知道我还应该在哪里修改,在 model 本身,ControllerService/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。

希望这对您有所帮助!