首页 > 解决方案 > 在 SpringBoot 中创建一个可重用的 Reader 类

问题描述

我正在做一个小型学习项目。在其中,我正在从 restservice 读取一些 JSON 并将其保存在 postgres 数据库中。restservice 有几个 JSON 模型,可从不同的 URL 获得。我创建了一个简单的读取器类,它从 url 读取 JSON 并将其发送到数据库。这适用于在 Reader 类中硬编码的 Model 和 Service 类。我试图让它更通用,但是我可以使用阅读器类并传入模型类和服务类(它有一个 add 方法,该方法从该模型的存储库调用 save 方法)。我尝试使用实现接口的模型并将接口作为读取器类的构造函数中的参数,或者将模型类名作为字符串传递给读取器构造函数,并且它是类加载器的参数。我没有 t 让它工作,可能这是一个愚蠢的语法问题,但也许这里有人可以帮忙。以下是课程:

@Slf4j
@Service
@AllArgsConstructor
public class Reader {

    private MapService mapService;

    public void readStream(String url) {

        try (InputStream is = new URL(url).openStream()) {

            JsonReader reader = new JsonReader(new InputStreamReader(is, "UTF-8"));
            Gson gson = new GsonBuilder().create();

            reader.beginArray();
            while (reader.hasNext()) {
                MapInputModel map = gson.fromJson(reader, MapInputModel.class);

                mapService.add(map);
            }

            reader.close();
        } catch (MalformedURLException e) {
            log.error("MalformedURLException" + e.getMessage());
        } catch (IOException e) {
            log.error("IOException" + e.getMessage());
        }
    }
}

.

@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.REQUIRED)
public class MapService {

    private final MapModelMapper mapModelMapper;
    private final MapEntityRepository mapEntityRepository;

    public void add(final MapInputModel mapInputModel) {
        mapEntityRepository.save(mapModelMapper.toEntity(mapInputModel));
    }

.

@Getter
@AllArgsConstructor
public class MapInputModel {

    private String name;
    private List<String> translations;
}

Mapservice 和 MapInputModel 需要用类似的类替换,例如:

@Getter
@AllArgsConstructor
public class IconModel {

    Map<String, String> icon;

}

我在这个项目中使用 SpringBoot 和 Lombok。

-------- 编辑:更新的类模型 ---------

@Getter
@AllArgsConstructor
public class MapInputModel implements InputModel {

    private String name;
    private List<String> translations;
}

public interface IService<T>{

    void add(final T model);
}


@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.REQUIRED)
public class MapService implements IService<MapInputModel> {

    private final MapModelMapper mapModelMapper;
    private final MapEntityRepository mapEntityRepository;

    @Override
    public void add(final MapInputModel mapInputModel) {
        mapEntityRepository.save(mapModelMapper.toEntity(mapInputModel));
    }

}

@Slf4j
public class Reader {

    private IService<InputModel> service;
    private InputModel model;

    public Reader(IService<InputModel> service, InputModel model) {
        this.service = service;
        this.model = model;
    }
    // code
}

标签: javaspring-bootgenerics

解决方案


推荐阅读