Java 在SpringBoot中创建可重用的读取器类
我正在做一个小的学习项目。在其中,我从restservice读取一些JSON,并将其持久化到postgres DB中。restservice有几个JSON模型,可以从不同的URL获得。我创建了一个简单的reader类,它从url读取JSON并将其发送到DB。这适用于Reader类中硬编码的模型和服务类。但是,我试图使它更通用,这样我就可以使用reader类并传入model类和service类(它有一个add方法,从该模型的存储库调用save方法)。我在实现接口的模型中尝试了这一点,将接口作为reader类的构造函数中的参数,或者将模型类名作为字符串传递给reader构造函数,并将其作为类加载器的参数。 我还没有让它工作,可能这是一个愚蠢的语法问题,但也许有人在这里可以帮助。以下是课程:Java 在SpringBoot中创建可重用的读取器类,java,spring-boot,generics,Java,Spring Boot,Generics,我正在做一个小的学习项目。在其中,我从restservice读取一些JSON,并将其持久化到postgres DB中。restservice有几个JSON模型,可以从不同的URL获得。我创建了一个简单的reader类,它从url读取JSON并将其发送到DB。这适用于Reader类中硬编码的模型和服务类。但是,我试图使它更通用,这样我就可以使用reader类并传入model类和service类(它有一个add方法,从该模型的存储库调用save方法)。我在实现接口的模型中尝试了这一点,将接口作为re
@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());
}
}
}
@Getter
@AllArgsConstructor
公共类MapInputModel{
私有字符串名称;
私人名单翻译;
}
Mapservice和MapInputModel需要用类似的类替换,如:
@Getter
@AllArgsConstructor
public class IconModel {
Map<String, String> icon;
}
@Getter
@AllArgsConstructor
公共类图标模型{
地图图标;
}
我在这个项目中使用SpringBoot和Lombok
--------编辑:更新的类模型---------
@Getter
@AllArgsConstructor
公共类MapInputModel实现InputModel{
私有字符串名称;
私人名单翻译;
}
公共接口设备{
void add(最终T模型);
}
@服务
@所需参数构造函数
@事务性(传播=传播。必需)
公共类映射服务实现IService{
私有最终MapModelMapper MapModelMapper;
私人最终地图保存地图保存地图保存;
@凌驾
公共无效添加(最终MapInputModel MapInputModel){
mapEntityRepository.save(mapModelMapper.toEntity(mapInputModel));
}
}
@Slf4j
公共类阅读器{
私人色情服务;
私有投入模型;
公共阅读器(iSeries服务、InputModel){
服务=服务;
this.model=模型;
}
//代码
}
我还没有让它工作,可能是一个愚蠢的语法问题。您是否收到错误/异常?我在原始帖子中发布了一些更新。在两个类中,我实现了一个接口。我试图将接口放在Reader类的构造函数中,这样我就可以用当时Reader对象所需的正确类来实例化它(并且可以在另一种情况下用Icon类来实例化它)。但是,这实际上不起作用。我无法获得正确的读取器实例。我尝试了:Reader=new Reader(mapService,MapInputModel.class);但这不正确。不确定构造函数是否正确,或者该构造函数是否也错了,
@Getter
@AllArgsConstructor
public class MapInputModel {
private String name;
private List<String> translations;
}
@Getter
@AllArgsConstructor
public class IconModel {
Map<String, String> icon;
}
@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
}