Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringBoot中创建可重用的读取器类_Java_Spring Boot_Generics - Fatal编程技术网

Java 在SpringBoot中创建可重用的读取器类

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

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

@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
}