java - 在 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
}
解决方案
推荐阅读
- c++ - lambda[=] 上的复制值被另一个封装 lambda[&] 阻塞
- haskell - 仅当输入值为“Just x”时才应用镜头“设置器”?
- drupal - 更改硬编码的默认首页 - Drupal 8
- php - 使用时获取[尝试获取非对象的属性] ->
- xml - 使用 XSL 选择具有唯一属性的非唯一元素的值
- apache-spark - 火花:加盐如何处理倾斜数据
- kubernetes - NEG 说 Pod 是“不健康的”,但实际上 Pod 是健康的
- node.js - Npm 命令已下载但无法识别
- mysql - 无法将“System.String”类型的对象转换为日期时间文字上的“System.DateTime”类型
- neural-network - 如何训练 10 位数字序列作为输入数据?