【问题标题】:Spring MVC Bean conversionSpring MVC Bean 转换
【发布时间】:2017-06-09 07:34:40
【问题描述】:

我有一个在 JSP 表单中成功使用的 POJO。我可以显示表格,并可以将结果发回。这是modelAttribute bean

public class FooAdminWebDTO implements Serializable {

private static final long serialVersionUID = -5296961362891142744L;

private List<FooDTO> FooDTOList;
private String success = "success"; //..etc

这是我的 JSP 页面中的一个例外:

    <form:form method="post" class="form-horizontal" id="viewForm"
           action="${pageContext.request.contextPath}/FooAdmin/saveFoo" modelAttribute="FooAdminWebDTO">

        <div class="form-group">
        <form:label class="col-sm-2" path="FooDTO" for="FooDTO" required="true">XYZ:</form:label>
        <form:input class="col-sm-5" path="FooDTO" id="FooDTO" type="number" value="${FooAdminWebDTO.FooDTO.FooXYZ}" required="true"/>
    </div>

    <div class="form-group">
        <form:label class="col-sm-2" path="success" for="success" required="true">Success:</form:label>
        <form:input class="col-sm-5" path="success" id="success" type="text" value="SUCCESS" required="true"/>
    </div>

问题出在我的 POST 区域。我成功地击中了正确的控制器方法:

    @RequestMapping(value = "/FooAdmin/saveFoo", method = RequestMethod.POST)
public ModelAndView saveFooByID(@ModelAttribute("FooAdminWebDTO") FooAdminWebDTO s, BindingResult bindingResult) {
    return new ModelAndView();
}

但是,正如预期的那样,我只看到成功字段的内容由 Spring 填充。成功字段是一个简单的字符串。 (所有其他复杂字段均为空)。

这里是对象:FooDTO:

@JavascriptMappable
public class FooDTO implements Serializable {

private static final long serialVersionUID = -5974170234812308892L;
private String FooDescription;
private int additionQuantity;

等等。

请有人指导我如何做到这一点?我使用 XML 进行配置,所以任何涉及配置的答案,请记住这一点。我有非常深的嵌套对象,需要一种方法将我的对象绑定到传入的 POST 对象。

谢谢。

【问题讨论】:

  • 只是为了确保,您是否在控制器中设置了对象属性“productAdminWebDTO”?我认为如果不是,那么您对“productDTO”字段的期望值如何。您的 JSP 页面是否显示“productAdminWebDTO.productDTO.productPrice”的值?

标签: java spring spring-mvc


【解决方案1】:

form:input 中的路径值应映射到您要在对象中填充的属性。

例如 对于 ProductAdminWebDTO.ProductDTO.productPartNumber 的输入标签,路径应该类似于 path="productDTO.productPartNumber"

您可以在http://docs.spring.io/spring/docs/current/spring-framework-reference/html/view.html#view-jsp-formtaglib-formtag 找到更多信息 或form binding的简单解释。在您的情况下,您需要访问嵌套对象,就像显示时一样,使用 . 完成

【讨论】:

  • 谢谢,但我不明白你的回答,这似乎与 JSP 页面的呈现有关。 JSP 页面呈现良好。 JSP 页面中的字段均已填充。当我尝试获取表单值时,在控制器中返回服务器的 POST 中出现问题 - 除了“成功”字符串之外,所有字段都为空。
  • 您的建议破坏了 JSP:bean 类 [ProductAdminWebDTO] 的无效属性“productAdminWebDTO”:Bean 属性“productAdminWebDTO”不可读或具有无效的 getter 方法:getter 的返回类型是否匹配参数类型设置器?
  • productAdminWebDTO 已在您的表单元素中设置为 modelAttribute,因此不应在路径的值中。我会适应
  • 感谢您的适应-我确实尝试了您的建议。可悲的是,什么都没有改变。 JSP 仍然像以前一样显示,但 ProductAdminWebDTO 中的所有字段仍然为空,除了平面字符串。是不是就像我最初要求对 Spring 做的那样,不理解这些复杂的对象而只理解字符串?
  • 我们在 ProductAdminWebDTO 中看不到所有代码,但 spring 可能会尝试在 ProductAdminWebDTO 中设置 productDTO 中的数据,即 null。您可能需要实例化 new ProductDTO(); List 通常由 spring 本身实例化
【解决方案2】:

回顾 HttpMessageConverter 负责将 HTTP 请求消息转换为关联的 java 对象。在我们的例子中,希望在发出请求时将 JSON 转换为 java 对象。 Spring 将专门寻找与 mime 类型关联的 HttpMessageConverter 来执行转换。

您必须将jackson依赖添加到您的项目中,并在spring中注册为消息转换器。

也检查一下:Spring 3.0 making JSON response using jackson message converter

【讨论】:

  • 我没有看到 content="application/json" .. 如果你想让你的控制器接受 json 你也应该在那里定义它。 stackoverflow.com/questions/17835545/…
  • 再说一次,我什至不确定 form:form 是否支持?接下来,是否有任何浏览器支持将表单提交为 application/json ? stackoverflow.com/questions/38017123/…
  • 我认为这可能是一个红鲱鱼。我忘记了明确设置内容,因为它可以工作。所以我已经从帖子问题中删除了这个。在所有情况下,都会转换基本字符串,但仍然没有转换任何复杂类型。
【解决方案3】:

发现错误。这是一段 JQuery

     $('#viewForm input').attr("disabled", true);
    $('#viewForm select').attr("disabled", true);

我在 JSP 的其他地方使用它来使字段不可编辑。我忘记重新启用表单,这就是它没有正确提交的原因。感谢那些试图提供帮助的人。

【讨论】:

  • 很高兴你让它工作了。如果您发布了更多代码,它可能会很快得到解决,我们不会在错误的方向上寻找解决方案。
猜你喜欢
  • 2010-10-23
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2018-01-05
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多