gpt4 book ai didi

java - PUT 和 POST 在未知属性上失败 Spring 不同的行为

转载 作者:IT老高 更新时间:2023-10-28 13:51:30 25 4
gpt4 key购买 nike

我正在使用 Spring Data Rest 存储库编写 Spring Boot 应用程序,如果请求正文包含具有未知属性的 JSON,我想拒绝访问资源。简化实体和存储库的定义:

@Entity
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String firstName;
private String lastName;

/* getters and setters */
}

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends CrudRepository<Person, Long> {}

我使用 Jackson 的反序列化功能来禁止 JSON 中的未知属性。

@Bean 
public Jackson2ObjectMapperBuilder objectMapperBuilder(){
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.failOnUnknownProperties(true);
return builder;
}

当我发送 POST 请求时,一切都按预期工作。当我使用有效字段时,我会得到正确的响应:

curl -i -x POST -H "Content-Type:application/json" -d '{"firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people
{
"firstName": "Frodo",
"lastName": "Baggins",
"_links": {...}
}

当我发送带有未知字段的 JSON 时,应用程序会抛出预期的错误:

curl -i -x POST -H "Content-Type:application/json" -d '{"unknown": "POST value", "firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unknown" (class Person), not marked as ignorable (2 known properties: "lastName", "firstName")

使用有效 JSON 时的 PUT 方法也会返回正确的响应。但是,当我发送带有未知字段的 PUT 请求时,我希望 Spring 会抛出错误,但 Spring 会更新数据库中的对象并返回它:

curl -i -x PUT -H "Content-Type:application/json" -d '{"unknown": "PUT value", "firstName": "Bilbo", "lastName": "Baggins"}' http://localhost:8080/people/1
{
"firstName": "Bilbo",
"lastName": "Baggins",
"_links": {...}
}

只有当数据库中没有给定id的对象时才会抛出错误:

curl -i -x PUT -H "Content-Type:application/json" -d '{"unknown": "PUT value", "firstName": "Gandalf", "lastName": "Baggins"}' http://localhost:8080/people/100
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unknown" (class Person), not marked as ignorable (2 known properties: "lastName", "firstName")

是 Spring Data Rest 中的预期行为还是错误?无论请求方法是什么,当将具有未知属性的 JSON 传递给应用程序时,如何抛出错误?

我通过修改 http://spring.io/guides/gs/accessing-data-rest/ 重现了这种行为 ,我所做的唯一更改是 Jackson2ObjectMapperBuilder ,此项目中没有其他 Controller 或存储库。

最佳答案

我认为您观察到的行为是设计使然。当发布 POST 时,您正在创建资源,以便将 JSON 反序列化为您的实体类型,而 Jackson 正在执行此任务。

PUT 在 Spring Data Rest 中的工作方式不同。有趣的部分在 PersistentEntityResourceHandlerMethodArgumentResolver.readPutForUpdate 中处理。

json 被读入 JsonNode,实体从数据存储中读取,然后在 DomainObjectReader.doMerge 中实现迭代 json 字段。它将 json 应用于实体并稍后在 Controller 实现中保存。它还会丢弃持久实体中不存在的所有字段:

if (!mappedProperties.hasPersistentPropertyForField(fieldName)) {
i.remove();
continue;
}

这是我阅读代码的理解。我认为您可以争辩说这是一个错误。您可以尝试在 spring data rest`s jira 报告它 - https://jira.spring.io/browse/DATAREST .据我所知,没有办法自定义这种行为。

关于java - PUT 和 POST 在未知属性上失败 Spring 不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34545997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com