将Spring启动从版本 1.5 更新到 2.7 后,POST 请求返回状态 400。
我有饲料仓库:
interface FeedRepository : PagingAndSortingRepository<Feed, Long> {
// Custom methods
}
SpringDataRest为他生成默认控制器,所以我可以在:localhost:8080/api/feeds上发出请求
馈电等级:
@Entity
@DiscriminatorValue("feed")
class Feed(
id: Long, //Superclass Fields,
@ManyToOne
val parent: Feed?,
@OneToMany(mappedBy = "parent", cascade = [CascadeType.REMOVE])
val children: List<Feed>,
@Column(name = "extension_id")
var extensionId: String?,
@Column(name = "create_date")
var created: Date = Calendar.getInstance().time
) : Resource(id, //Superclass Fields)
资源类:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type")
@JsonSubTypes(value = [
// SubTypes
JsonSubTypes.Type(value = Feed::class, name = "feed"),
])
abstract class Resource(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
override val id: Long,
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "resource_tags",
joinColumns = [JoinColumn(name = "resource_id")],
inverseJoinColumns = [JoinColumn(name = "tag_id")]
)
val tags: Set<Tag> = Collections.emptySet(),
@JsonIgnore
@OneToMany(mappedBy = "resource", cascade = [CascadeType.REMOVE])
val menuItems: List<Menu> = ArrayList(0),
// Another Fields
)
对象映射器 Bean:
@Bean(name = arrayOf("OBJECT_MAPPER_BEAN"))
fun jsonObjectMapper(): ObjectMapper {
return Jackson2ObjectMapperBuilder.json()
.serializationInclusion(JsonInclude.Include.ALWAYS)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.featuresToDisable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)
.featuresToDisable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS)
.modules(JavaTimeModule())
.build<ObjectMapper>()
}
如果我使用有效负载执行保存请求(POST localhost:8080/api/feeds ):
{
"type": "packages.Feed",
"parent": "https://localhost:8080/api/feeds/251",
"extensionId": null,
"title": {
"localizedStrings": [
"https://localhost:8080/api/localizedStrings/4319"
]
}
}
我收到状态 400 并出现错误:
JSON分析错误:JSON属性标记的[simple type,class Feed]值的实例化失败,因为creator参数标记缺少值(因此为NULL ),这是一种不可为NULL的类型。嵌套异常为com . faster XML . Jackson . module . kotlin . missingkotlinparameterexception:JSON属性标记的[simple type,class Feed]值的实例化失败,因为在[Source:(org . spring framework . util . stream utils $ NonClosingInputStream)处缺少creator参数标记的值(因此为NULL),该值是不可为NULL的类型;第10行,第1列](通过引用链:Feed["tags"])
看起来 Jackson 库处理请求正文的方式略有不同,因为这在更新之前就已经工作了。
我试图在Feed class @JsonProperty中为字段“tags”指定一个注释(required = false),但是没有帮助。
有什么办法解决这个问题吗?如果能得到帮助,我将不胜感激。
我通过将配置添加到Jackson Kotlin模块中解决了这个问题。
现在创建的ObjectMapper如下所示:
@Bean(name = arrayOf("OBJECT_MAPPER_BEAN"))
fun jsonObjectMapper(): ObjectMapper {
return Jackson2ObjectMapperBuilder.json()
.serializationInclusion(JsonInclude.Include.ALWAYS)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.featuresToDisable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)
.featuresToDisable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS)
.modules(JavaTimeModule(), KotlinModule.Builder()
.configure(KotlinFeature.NullToEmptyCollection, true)
.configure(KotlinFeature.NullToEmptyMap, true)
.configure(KotlinFeature.NullIsSameAsDefault, true)
.configure(KotlinFeature.SingletonSupport, false)
.configure(KotlinFeature.StrictNullChecks, false)
.build()
)
.build<ObjectMapper>()
}
在运行了几个测试之后,我可以说一切都如预期的那样运行。
问题中缺少一些基本代码,例如错误消息中提到的属性标记
如何获取其值。班级提要
很可能会像这样继续下去
class Feed(
id: Long,
tags: Set<Tag>,
[other code here]
) : Resource(id, tags, //Superclass Fields)
如果是这种情况,Jackson在构造类< code>Feed时会有问题,因为< code>tags的默认值丢失了(即使它是在parent中定义的)。在这种情况下,向类< code>Feed中的< code>tags添加默认值应该可以解决这个问题。
class Feed(
id: Long,
tags: Set<Tag> = Collections.emptySet(),
[other code here]
问题内容: 我刚刚更新了Angular + Ionic的新版本,并且处理远程请求的方法停止工作并始终返回404响应。 请求如下: 处理远程请求的方法的代码如下: 但是没有运气。 服务器端通过这种方式处理请求: 如果我试图使用邮递员或卷曲发送请求,一切似乎都在工作。 离子信息: AngularJS版本: 我该如何解决? 非常感谢您的任何建议 问题答案: 哼,我只是遇到了同样的问题:标头表明它已经被拿
我刚刚更新了Angulal+Ionic的新版本,处理远程请求的方法停止工作,返回总是404响应。 请求如下: 请问我该怎么解决? 多谢你的忠告
嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单。 我抄了 如果我从VerifyCsrfToken检查中排除它,我的代码工作完全正常。但是我确实希望令牌验证有效。 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419。 抱歉下面的长代码,但他们在这里(我知道我没有做任何关于设置会话和东西,请忽略现在因为代码返回419状态) 路线/web.php login.j
我有一个springboot/openapi应用程序。不依赖Spring Security性。通过swagger启动POST请求时,返回的状态为403。请求未到达控制器类。然而,Get请求确实有效,并返回状态200。 配置如下 application.yaml 403状态的原因可能是什么? 控制器
我必须做一个帖子,但我得到错误405 在本网站->http://177.66.89.34:8079/transparencia/#我需要迭代页面顶部的2个下拉菜单的选项。 首先,我会在“escolha o exercício”旁边加上选项:然后,我会在“escolha a entidade”旁边加上选项: 用下面的代码,我在“EscolhaoExercício:”上面写了一篇文章 我希望在pars
我试图使超文本传输协议后请求获得api令牌。如果成功,它应该返回访问令牌、令牌类型(承载)和expires_in的字符串值。 我的代码是一个通用的,我希望看到它能工作。但是由于某些原因,它抛出了一个例外400“远程服务器返回了一个错误。错误请求”。我一直在尽一切努力修复这个问题,但结果没有改变。 当我调试代码并在输出窗口中看到结果时,数据流有一个异常,说“这个流不支持查找操作” 我怀疑这是由于po