Как автоматически отображать атрибуты из карты Java в атрибуты класса POJO

Я работаю над приложением весенней загрузки и разрабатываю службу весеннего отдыха (PATCH).

У меня есть ситуация, когда мне нужно сопоставить данные, полученные по запросу PATCH в HashMap из внешнего интерфейса, в класс POJO java.

Атрибуты, которые мне нужно отобразить в классе POJO, присутствуют в ключе Hashmap. Нам нужно выполнить итерацию по карте и связать значение ключа на карте с атрибутом класса POJO.

Как лучше всего это сделать? Я знаю, что есть очень сложный способ, когда я вручную проверяю каждый ключ на карте и связываю соответствующее значение с соответствующим установщиком в классе POJO. Но это чрезвычайно громоздко, если количество атрибутов в классе POJO велико.

Есть ли эффективный способ добиться этого?

Фрагмент кода

@CrossOrigin
    @RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
    public Project editProject(@RequestBody Map<String, String> project, @PathVariable("id") String id) throws Exception {

        logger.info("Inside editProject() API ");

        if (project == null) {
            return null;
        }

        for(String key: project.keySet()) {
            logger.info("Keys passed for update ==> Key(" + key + "): Value(" + project.get(key) + ")");
        }

        Project projectRec = null;

        try {

            logger.info("updateProject() :: Before save :: ");

            projectRec = projectService.updateProjectInfo(project, id);

            logger.info("updateProject() :: After save :: Saved successfully ::: ", projectRec.toString());
        }
        catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }

        logger.info("Leaving createProject() API");

        return projectRec;
    }

public Project updateProjectInfo(Map<String, String> projectRec, String id) {

        logger.info("Inside updateProjectInfo() API in ProjectServiceImpl");

        Project dbRec = projectRepository.findOne(id);

        setAttributesfromMaptoDBRec(projectRec, dbRec);

        Project updatedProjectRec = null;

        logger.info(" Leaving updateProjectInfo() API in ProjectServiceImpl");

        return updatedProjectRec;
    }

private void setAttributesfromMaptoDBRec(Map<String, String> updatedProjectRecMap, Project updatedProjectRec) {

        logger.info(" Inside setAttributesfromMaptoDBRec() API in ProjectServiceImpl");

        Set<String> nonUpdateableAttributes = ProjectServiceImpl.nonUpdateableKeys.get(ProjectServiceImpl.nonUpdateable);

        if (updatedProjectRecMap == null) {
            logger.warn(" Input Map to service is null in ProjectServiceImpl ===> " + (updatedProjectRecMap == null));
            return;
        }

        for(String key: updatedProjectRecMap.keySet()) {

            logger.info(" Project property ===>  " + key);

            logger.info(" nonUpdateableAttributes contains key  ===> " + nonUpdateableAttributes.contains(key));

            if (!nonUpdateableAttributes.contains(key)) {
                try {
                    System.out.println("Field name: " + updatedProjectRec.getClass().getField(key));
                    System.out.println("HOW TO AUTOMATICALLY SET THE ATTRIBUTE TO THE POJO CLASS BASED ON THE KEY ??");
                } catch(Exception ex) {
                    ex.printStackTrace();
                }

            }
        }


    }

Если ключи на карте совпадают с именами свойств POJO, вы можете попробовать использовать отражение

Ivan 07.02.2019 06:17

Я сделал это задолго до использования Jackson objectMapper.readObject и writeObject.

Shailesh Saxena 07.02.2019 06:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
821
1

Ответы 1

Я сделал нечто подобное давно, используя API привязки данных Джексона. Не уверен, но это может быть полезно:

import java.util.Map;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ObjectMarshalUtility {

    public static <T> Map marshalObject(T obj){
        ObjectMapper oMapper = new ObjectMapper();
        oMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        return oMapper.convertValue(obj, Map.class);
    }

    public static <T> T unMarshalObject(Class<T> classType, Map<String, Object> map){
        ObjectMapper oMapper = new ObjectMapper();
        oMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        return oMapper.convertValue(map, classType);
    }
}

Для преобразования DTO в MAP:

Map<String,Object> searchInputMap=ObjectMarshalUtility.marshalObject(searchInputDTO);

Для преобразования карты в DTO:

SearchInputDTO searchInputDTO=ObjectMarshalUtility.unMarshalObject(searchInputMap);

Другие вопросы по теме