Как правильно установить атрибут объекта, используя отражение в Java? - PullRequest
1 голос
/ 16 октября 2019

Пример базы данных ResultSet

fclass,geometry,scenario
""elementary_school"","MULTIPOINT(303400.907447057 9044592.97070337)",66
""elementary_school"","MULTIPOINT(302777.056751395 9044333.43169871)",66
""elementary_school"","MULTIPOINT(304182.88271353 9042435.93276122)",66
""elementary_school"","MULTIPOINT(304592.928219703 9041564.59729198)",66
""elementary_school"","MULTIPOINT(311385.417245523 9052785.71100888)",66
""worship"","MULTIPOINT(307397.04764638 9039421.31774996)",66
""worship"","MULTIPOINT(304384.660908793 9047145.34109501)",66
""worship"","MULTIPOINT(304518.616783947 9039859.48619132)",66
""worship"","MULTIPOINT(304689.11878157 9041491.61685193)",66
""worship"","MULTIPOINT(304711.539434326 9047763.53595371)",66
""worship"","MULTIPOINT(303420.353637529 9048419.36252138)",66

Класс, доступ к которому осуществляется с помощью отражения

public class Amenities {
    public Integer amenities_id;
    public Integer scenario;
    public String fclass;
    public String location;
    public String buffer;
    public TableInfo[] amenity_info;
}

Использование отражения

private PostStatus getAmenities(String layerUP, String layer, String[] tableUP, String[] table, String scenarioId) {
        PostStatus postStatus=new PostStatus();
        String values = "";
        for (int i = 0; i < tableUP.length; i++) {
            if (tableUP[i].equals("location")) {
                //values += "st_astext("+table[i]+")";
                values += "st_astext("+table[i]+") as "+table[i];
            } else if (tableUP[i].equals("scenario")) {
                values += scenarioId+" as scenario";
            } else {
                values = "property_json->'" + table[i] + "' as "+ table[i] ;
            }
            if (i < tableUP.length - 1) {
                values += ",";
            } else {
                values = values.replaceAll(",$", "");
            }
        }
        String errorMsg = "";
        String query ="";
        try (
                Connection connection = DriverManager.getConnection(
                        upURL,
                        upUser,
                        upPassword)) {

            Statement statement = connection.createStatement();
            query="select " + values + " from user_layer\n"
                    + "inner join user_layer_data on user_layer.id = user_layer_data.user_layer_id\n"
                    + "where user_layer.id=" + layer;
            ResultSet data = statement.executeQuery(query);

            ArrayList<Amenities> data_in = new ArrayList<>();

            while (data.next()) {
                Object o = new Amenities();
                Class<?> c = o.getClass();
                for (int i = 0; i < tableUP.length; i++) {
                    try {
                        Field f = c.getDeclaredField(tableUP[i]);
                        f.setAccessible(true);
                        if (!tableUP[i].equals("scenario") || !tableUP[i].equals("amenities_id")) {
                            f.set(o, data.getString(table[i]));
                        } else if (tableUP[i].equals("scenario")) {
                            Integer scen=(Integer)data.getInt(tableUP[i]);
                            f.set(o,scen );                            
                        } else if (tableUP[i].equals("location")) {
                            f.set(o, data.getString(table[i]));
                        } else if (tableUP[i].equals("amenities_id")) {
                        }
                    } catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException | SQLException e) {
                        log.error(e, errorMsg);
                    }
                }
                log.debug(o, "reflection");
                data_in.add((Amenities) o);
            }
            Tables<Amenities> final_data = new Tables<Amenities>(data_in);

            RestTemplate restTemplate = new RestTemplate();
            postStatus=restTemplate.postForObject("http://" + upwsHost + ":" + upwsPort + "/amenities/", final_data, PostStatus.class);
            return postStatus;
        } catch (SQLException ex) {
            for (Throwable e : ex) {
                if (e instanceof SQLException) {

                    e.printStackTrace(System.err);
                    errorMsg += "SQLState: " + ((SQLException) e).getSQLState();

                    errorMsg += "Error Code: " + ((SQLException) e).getErrorCode();

                    errorMsg += "Message: " + e.getMessage();

                    /*Throwable t = ex.getCause();
                    while (t != null) {
                        errorMsg += "Cause: " + t;
                        t = t.getCause();
                    }*/
                }
            }
            log.error(ex, errorMsg+query);
        }catch(Exception e){
            log.error(e, errorMsg+query);
        }
        postStatus.status="Error";
        postStatus.message=errorMsg+query;
        return postStatus;
    }

Мой код не работает, когда он устанавливает значение целочисленного атрибута объекта Amenites, используя код Integer scen=(Integer)data.getInt(tableUP[i]); f.set(o,scen );, когда я проверяю результаты, другие значения назначаются правильно, но значение поляСценарий остается нулевым.

Я уверен, что значения из базы данных ResultSet существуют, также я попытался установить статическое целочисленное значение 66, и он показывает только поле со значением 0.

Поскольку я довольно новичок в Java, буду признателен, если вы поможете мне понять, что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...