【问题标题】:ModelAttribute for Restful PUT method not populated value ( JSON )用于 Restful PUT 方法的 ModelAttribute 未填充值 ( JSON )
【发布时间】:2013-11-05 04:52:01
【问题描述】:

我正在使用 Spring MVC 构建一个完全安静的 Web 应用程序。当我有一个 PUT 方法时,我的 @ModelAttribute 表单 bean 没有被填充(所有值都为空)。如果我使用 POST 方法,一切都会正确填充。

我向 Postman (https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm) 查询 图片请求邮递员:http://www.hostingpics.net/viewer.php?id=474577probleme.jpg

@Entity
@Table(name = "positiongps")
public class PositionGPS implements BaseEntity<Long> {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false, columnDefinition = "SERIAL", updatable = false)
private Long id;

@Column(name = "latitude", precision = 11, scale = 7, columnDefinition = "NUMERIC", nullable = false, updatable = true, unique = false)
private BigDecimal latitude;

@Column(name = "longitude", precision = 11, scale = 7, columnDefinition = "NUMERIC", nullable = false, updatable = true, unique = false)
private BigDecimal longitude;

// ** Constructeur **//

public PositionGPS() {
    super();
    latitude = new BigDecimal("0");
    longitude = new BigDecimal("0");
}

// ** Get and Set **//

.

@ResponseBody
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public boolean update(@ModelAttribute("positionGPS") PositionGPS positionGPS, @PathVariable Long id, Model model) {
    LOG.debug("update :: IN, PositionGPS.Id=[" + id + "]");
    PositionGPS positionGPSOld = positionGPSService.getById(id);
    LOG.debug("update :: getId=[" + positionGPS.getId() + "]");
    LOG.debug("update :: getLatitude=[" + positionGPS.getLatitude() + "]");
    LOG.debug("update :: getLongitude=[" + positionGPS.getLongitude() + "]");

    try {
        if (positionGPSOld != null) {
            positionGPSOld.setLatitude(positionGPS.getLatitude());
            positionGPSOld.setLongitude(positionGPS.getLongitude());
            PositionGPS newpositionGPS = positionGPSService.update(positionGPSOld);
        } else {
            LOG.debug("update :: PositionGPS Error test");
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return true;
}

web.xml

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>httpMethodFilter</filter-name>
    <filter-  class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>httpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我的控制台:

DEBUG: PositionGPSController - update :: IN,   PositionGPS.Id=[136]
DEBUG: PositionGPSController - update :: getId=[136]
DEBUG: PositionGPSController - update :: getLatitude=[0]
DEBUG: PositionGPSController - update :: getLongitude=[0]

【问题讨论】:

    标签: java json spring rest put


    【解决方案1】:

    我替换

    @ModelAttribute("positionGPS") PositionGPS positionGPS, @PathVariable Long id, Model model
    

    @RequestBody PositionGPS positionGPS, @PathVariable Long id, Model model)
    

    链接帮助: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-enable

    Spring MVC: Don't deserialize JSON request body

    【讨论】:

    • 那行得通吗?如果是这样,那么我假设您已经在类路径中拥有 Jackson,用于从 JSON 编组到对象。您指定您正在使用 Postman,但这显然不会成为您最终的工作解决方案。您必须使用 Ajax 或表单帖子。如果您使用的是表单发布,这仍然无法正常工作,因为它不支持跨浏览器的 PUT 操作。
    • 我在一个单元应用程序和主干上进行了测试,一切正常。
    【解决方案2】:

    如果您使用的是 HTML 表单,它不支持 PUT。如果您想支持 PUT,那么您需要发送使用 Ajax 序列化的表单内容。通过 XMLHttpRequest,您可以使用所有主要动词(OPTIONS、GET、POST、PUT、DELETE)。如果您不能使用 Ajax,则唯一的其他选择是通过 POST 对所有内容进行隧道创建、更新和删除操作。

    【讨论】:

      【解决方案3】:

      将以下过滤器添加到您的 WebApplicationInitializer 类或相应的 xml 代码到 web.xml

      final FilterRegistration.Dynamic httpMethodFilter = servletContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter());
              httpMethodFilter.addMappingForUrlPatterns(null, true, "/*");
      
              final FilterRegistration.Dynamic putFormFilter = servletContext.addFilter("httpPutFormContentFilter", new HttpPutFormContentFilter());
              putFormFilter.addMappingForUrlPatterns(null, true, "/*");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-11
        • 2014-01-30
        • 2012-12-04
        • 2015-12-10
        • 1970-01-01
        • 2014-12-14
        • 2020-09-01
        • 1970-01-01
        相关资源
        最近更新 更多