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

Spring数据剩余- POST请求返回状态400

闾丘选
2023-03-14

将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),但是没有帮助。

有什么办法解决这个问题吗?如果能得到帮助,我将不胜感激。

共有2个答案

墨高杰
2023-03-14

我通过将配置添加到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>()
}

在运行了几个测试之后,我可以说一切都如预期的那样运行。

陶智
2023-03-14

问题中缺少一些基本代码,例如错误消息中提到的属性标记如何获取其值。班级提要很可能会像这样继续下去

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