Весна.THYMELEAF.Проблемы с разрешением строки по THYMELEAF - PullRequest
0 голосов
/ 16 февраля 2019

Thymeleaf не может отображать и разрешать мои объекты.Я думаю, я делаю что-то неправильно в HTML-файл.Пожалуйста, проверьте его

public class Ingredient {

    private final String id; 
    private final String name;
    private final Type type;

public static enum Type {
    WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
}

класс Taco

public class Taco {


    private String name;
    private List<String> ingredients;

}

класс контроллера

@Slf4j
@Controller
@RequestMapping("/design")
public class DesignTacoController {


@ModelAttribute
public void addIngredientsToModel(Model model) {
    List<Ingredient> ingredients = Arrays.asList(
            new Ingredient("FLTO", "Flour Tortilla", Type.WRAP),
            new Ingredient("COTO", "Corn Tortilla", Type.WRAP),
            new Ingredient("GRBF", "Ground Beef", Type.PROTEIN),
            new Ingredient("CARN", "Carnitas", Type.PROTEIN),
            new Ingredient("TMTO", "Diced Tomatoes", Type.VEGGIES),
            new Ingredient("LETC", "Lettuce", Type.VEGGIES),
            new Ingredient("CHED", "Cheddar", Type.CHEESE),
            new Ingredient("JACK", "Monterrey Jack", Type.CHEESE),
            new Ingredient("SLSA", "Salsa", Type.SAUCE),
            new Ingredient("SRCR", "Sour Cream", Type.SAUCE)
    );

    Type[] types = Ingredient.Type.values();
    for (Type type : types) {
        model.addAttribute(type.toString().toLowerCase(),
                filterByType(ingredients, type));
    }
}


@GetMapping
public String showDesignForm(Model model) {
    model.addAttribute("design", new Taco());
    return "design";
}

@PostMapping
public String processDesign(@Valid @ModelAttribute("design") Taco design, Errors errors, Model model) {
    if (errors.hasErrors()) {
        return "design";
    }


    log.info("Processing design: " + design);

    return "redirect:/orders/current";
}


private List<Ingredient> filterByType(
        List<Ingredient> ingredients, Type type) {
    return ingredients
            .stream()
            .filter(x -> x.getType().equals(type))
            .collect(Collectors.toList());
}}

HTML.Просто часть этого, я думаю, проблема только в этом.Похоже, ваш пост в основном кодовый;пожалуйста, добавьте некоторые подробности. Похоже, что ваш пост в основном код;пожалуйста, добавьте больше деталей.

<form method="POST" th:object="${design}">

<div class="ingredient-group" id="proteins">
            <h3>Pick your protein:</h3>
            <div th:each="ingredient : ${protein}">
                <input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
                <span th:text="${ingredient.name}">INGREDIENT</span><br/>
            </div>
        </div>

1 Ответ

0 голосов
/ 16 февраля 2019

JavaDoc для @ModelAttribute говорит

Аннотация, которая связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели

Ваш методне возвращает значение, так как оно недействительно.
Удалите аннотацию из addIngredientsToModel и вызовите ее внутри вашего showDesignForm @GetMapping метода.

@GetMapping
public String showDesignForm(Model model) {
    addIngredientsToModel(model);
    model.addAttribute("design", new Taco());
    return "design";
}

В качестве альтернативы, если вы все еще хотитечтобы иметь общие атрибуты, предоставляемые с помощью метода @ModelAttributes, вам необходимо вернуть Map<String, List<Ingredient>> из этого метода.

@ModelAttribute("types")
public Map<String, List<Ingredient>> addIngredientsToModel() { ... }

Тогда вы сможете получить доступ к protein через

<div th:each="ingredient : ${types.get('protein')}">
   <input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
   <span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...