Переберите элементы в ResponseBody и поместите их в Spring HotMap Boot - PullRequest
0 голосов
/ 03 марта 2019

В контроллере REST при загрузке Spring я пытаюсь перебрать значения в ответе RequestBody и поместить некоторые из них в HashMap в конечную точку POST.

JSON, который я отправляю, имеет следующую структуру:

{"name":"yogurt","vitaminA":6,"vitaminb12":5}

На данный момент конечная точка выглядит так:

@RequestMapping("/create")
public NutrientList createNUtrientList(@RequestBody NutrientList nutrientList) {
    Map<String, Double> nutrientMap = new HashMap<String,Double>();
    //get nutrient values, need help with this part
    for()
    //add values to map
    NutrientList nl = new NutrientList(nutrientList.getName(), nutrientMap);
    //will save to repository
    return nl;
}

Класс NutrientList выглядит следующим образом:

public class NutrientList {
    @Id
    private ObjectId id;
    @JsonProperty("name")
    private String name;
    @JsonProperty("nutrientMap")
    Map <String,Double> nutrientMap = new HashMap<String,Double>();

    public NutrientList() {}

    public NutrientList(String name, Map<String, Double> nutrientMap) {
        this.id = new ObjectId();
        this.name = name;
        this.nutrientMap = nutrientMap;
    }
    //setters and getters
}

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

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

РЕДАКТИРОВАТЬ: я мог бы поочередно преобразовать CSV, где я получил данные в базе данных, в формат JSON с картой, но я не нашел онлайн-инструмент, который дает мнеэта гибкость.

1 Ответ

0 голосов
/ 03 марта 2019

Если у вас есть список допустимых ключей, вы можете использовать следующее:

private static final List<String> validKeys = Arrays.asList("vitaminA", "vitaminB" /* ... */);

@RequestMapping("/create")
public NutrientList createNutrientList(@RequestBody Map<String, Object> requestBody) {
    Map<String, Double> nutrientMap = new HashMap<>();
    for (String nutrient : requestBody.keySet()) {
        if (validKeys.contains(nutrient) && requestBody.get(nutrient) instanceof Number) {
            Number number = (Number) requestBody.get(nutrient);
            nutrientMap.put(nutrient, number.doubleValue());
        }
    }
    String name = (String) requestBody.get("name"); // maybe check if name exists and is really a string
    return new NutrientList(name, nutrientMap);
}

Если вы хотите использовать Java 8 Stream API, вы можете попробовать:

private static final List<String> validKeys = Arrays.asList("vitaminA", "vitaminB" /* ... */);

@RequestMapping("/create")
public NutrientList createNutrientList(@RequestBody Map<String, Object> requestBody) {
    Map<String, Double> nutrientMap = requestBody.entrySet().stream()
            .filter(e -> validKeys.contains(e.getKey()))
            .filter(e -> e.getValue() instanceof Number)
            .collect(Collectors.toMap(Map.Entry::getKey, e -> ((Number) e.getValue()).doubleValue()));
    String name = Optional.ofNullable(requestBody.get("name"))
            .filter(n -> n instanceof String)
            .map(n -> (String) n)
            .orElseThrow(IllegalArgumentException::new);
    return new NutrientList(name, nutrientMap);
}

Hopeэто помогает.

...