当前位置: 首页 > 知识库问答 >
问题:

如何从下拉列表传递值

仉姚石
2023-03-14

我正在使用Spring MVC Thymeleaf项目,我在将字段值传递给对象时遇到了问题。有maltCountry实体。在malt表单中,有一个下拉列表,由DB填充-仅限国家名称-没什么大不了的。我可以填充列表,但当我单击“提交”按钮时,有一些错误。下面的代码(仅限相关部分):

麦芽实体:

@Setter
@Getter
@NoArgsConstructor
@Entity
@ToString
@Table(name="malt")
public class Malt extends BaseEntity {

    @Column(name="malt_name")
    private String maltName;

    @ManyToOne(fetch=FetchType.EAGER,
            cascade= {CascadeType.PERSIST, CascadeType.MERGE,
                    CascadeType.DETACH, CascadeType.REFRESH})
    @JoinColumn(name="producer_id")
    private Producer producer;

    @Column(name="malt_filling")
    private int maltFilling;

    @Column(name="malt_ebc")
    private int maltEbc;

    @Column(name="malt_usage")
    private String maltUsage;

    @ManyToOne(fetch=FetchType.EAGER,
            cascade= {CascadeType.PERSIST, CascadeType.MERGE,
                    CascadeType.DETACH, CascadeType.REFRESH})
    @JoinColumn(name="country_id")
    private Country country;

    @ManyToMany(mappedBy="malts")
    private Set<Batch> batches;

麦芽控制器:

@Controller
@RequestMapping("/malt")
public class MaltController {

@ModelAttribute("countries")
public Collection<Country> populateCountries() {
    return countryService.findAll();
}

@RequestMapping("{id}/update")
public String updateMalt(@PathVariable String id, Model model) {
    model.addAttribute("malt", maltService.findById(Long.valueOf(id)));
    return "malt-form";
}

@PostMapping
public String saveOrUpdate(@ModelAttribute Malt malt) {
    Malt savedMalt = maltService.save(malt);
    return "redirect:/malt/" + savedMalt.getId() + "/malt-show";
}

麦芽形态:

<div class="form-field-input">
    <select class="form-control" th:field="*{id}">
        <option value="0">Select country</option>
        <option
            th:each="country : ${countries}"
            th:value="${country.id}"
            th:text="${country?.countryName}">
        </option>
    </select>
</div>
<div class="form-field-submit">
    <button class="submit-button" type="submit">Submit</button>
</div>

Malt展示模板:

<div class="wrapper">
            <div class="main">
                <div class="page-title">
                    <p th:text="${malt.maltName}">Malt name</p>
                </div>
                <div class="show">
                    <div class="form-row">
                        <div class="form-field-name">
                            <label>Producer:</label>
                        </div>
                        <div class="form-field-input">
                            <p th:text="${malt.producer.producerName}">Producer name</p>
                        </div>
                    </div>
                    <div class="form-row">
                        <div class="form-field-name">
                            <label>Country:</label>
                        </div>
                        <div class="form-field-input">
                            <p th:text="${malt.country.countryName}">Country</p>
                        </div>
                    </div>
                    <div class="form-row">
                        <div class="form-field-name">
                            <label>Malt filling:</label>
                        </div>
                        <div class="form-field-input">
                            <p th:text="${malt.maltFilling}">Malt filling</p>                       
                        </div>
                    </div>
                    <div class="form-row">
                        <div class="form-field-name">
                            <label>Malt usage:</label>
                        </div>
                        <div class="form-field-input">
                            <p th:text="${malt.maltUsage}">Malt usage</p>
                        </div>
                    </div>
                    <div class="form-row">
                        <div class="form-field-name">
                            <label>Malt EBC:</label>
                        </div>
                        <div class="form-field-input">
                            <p th:text="${malt.maltEbc}">Malt EBC</p>
                        </div>
                    </div>

                </div>
            </div>
        </div>

我得到的结束错误:

An error happened during template parsing (template: "class path resource [templates/malt-show.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/malt-show.html]")
.
.
.
Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "malt.country.countryName" (template: "malt-show" - line 44, col 11)
    at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
    at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
    ... 52 more
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "malt.country.countryName" (template: "malt-show" - line 44, col 11)
    at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:290)
.
.
.
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'countryName' cannot be found on null    

链接到回购:https://github.com/fangirsan/maruszka-new/tree/malt-form-problem

我尝试了很多不同的方法,但没有结果。

共有1个答案

姬向明
2023-03-14

正如例外情况所述,问题是您的malt show表单中的${malt.country.countryName}。在异常stacktrace的最后一行中,我看到在null上找不到属性或字段“countryName”。这意味着您正试图获取一个空的相关模型属性。您的malt表中的country\u id列可能为空。换言之,国家/地区id未与其他字段一起保存。根据这些假设,您将在保存麦芽糖的表格中发现问题。我检查了此表单,可能问题是<代码>

重要提示:

一些相关模型可以为空,例如,假设您的malt模型中的国家/地区可以为空(取决于应用程序业务逻辑)。如果关系为空,访问模式中的模型关系字段可能会产生上述错误。因此,在这些情况下,您应该在thymeleaf模板中使用null检查。

 类似资料:
  • 给定以下代码: 和一个jsp: 如何将在下拉列表中选择的值传递回Spring控制器?目前,当我尝试执行此操作时,得到的请求参数无效。

  • 我明白我需要用硒,但我不知道怎么用。结果始终是单个字符串的列表。理想情况下,我希望返回两个列表:一个带有unix datestamp(option value=“1576627200”),另一个带有“normal”日期(即18/12/2019)的列表。 任何帮助都将不胜感激。

  • 我正在尝试将一个对象(或只是ID)传递给我的控制器,我从下拉列表中选择它。有2个类:产品和类别(产品包含一个外键,这是类别的ID)这是我如何将其加载到: 如您所见,我正在将对象类别传递到我的. jsp中。在那里我显示了用户可以选择的所有类别。 该值应该传递给我的控制器,但我不知道如何传递它。

  • 我在页面上有一个表单,用户可以在其中保存信息,还有一个下拉列表,可以从保存文件的目录中提取这些保存的文件。我想要的是当他们进入该页面时,当他们从下拉框中选择文件名时,它会将文件名放在输入框“CodeDescription”字段中,并将文件信息放在文本区域“Code”中,但我不确定如何解析该文件。下面是我当前的代码。 或者,相反地,我不介意在下拉菜单中选择正确的文件时,它只是在表单字段下面显示输出。

  • 下面给出了一段表示下拉列表的代码。我需要在此下拉列表中选择日期值,由<代码> 以下方法无效 1。)使用“按导入组织选择”选择此值。openqa。硒。支持用户界面。选择 控制台显示: 元素应该是“选择”,但应该是“选项” 2.)首先单击下拉列表以显示要选择的选项,然后单击该选项。 控制台显示: 调试元素缺少可访问的名称:id:类型,标记名:选择,类名:文本输入ng原始ng未触及ng有效ng范围 3.

  • 增加下拉列表在到按钮上,确保 data-activates 属性匹配 <ul> 标签的 id,你可以增加分隔线通过 <li class="divider"></li> 标签。 <!-- Dropdown Trigger --> <a class='dropdown-button btn' href='#' data-activates='dropdown1'>单击我</a> <!-- D