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

Spring Data Rest 2.1.0无法发布或放置复杂资源

微生运浩
2023-03-14

编辑:这似乎也发生在PUTs上。

使用spring data rest webmvc 2.1.0版。BUILD-SNAPSHOT我发现我无法发布关系指向已存在资源的资源。我有两个这样的实体,它们需要实例化引用并发布到它们的任一endpoint,从而导致以下行为。

在没有必要的参考资料的情况下发布资源效果很好。

我做了一点挖掘,似乎PeristentEntityResourceHandlerMethod odArgumentResolver发现MappingJackson2HttpMessageConverter很好,但它最终在检查ObjectMapper是否可以反序列化类型时抛出异常。异常的原因是NullPointerException

示例POST w/关系到 /reservations:

{“description”:“test\u post”,“dateMade”:“2014-03-03T08:04:44.293-0600”,“timeLastChanged”:null,“userLastChanged”:null,“courseTypeId”:null,“numCredits”:null,“讲师”:null,“numParticipants”:null,“reservationType”:“MCU”,“status”:“REQUESTED”,“abstract”:null,“requestor”:http://localhost:8080/users/2,“提交者”:http://localhost:8080/users/2“,”会议“:[]}

回应:

<代码>{原因:空消息:“未找到合适的HttpMessageConverter,无法将请求正文读取到类域类型的对象中。保留来自内容类型为application/json的请求!”}

发布与/房间组没有关系:

<代码>{“description”:“All Rooms”,“isOffNetwork”:false,“roomGroupType”:“STANDARD”}

回应:

201创建

我发布的JSON是否有问题,导致从ObjectMapper产生NPE?是否有某种解决方法?这在2.0.0中对我有用。RC1使用稍微不同的方案在JSON中包含引用链接,并且由于Jackson依赖项的版本似乎保持不变,我想知道是什么导致了这个问题...

感谢任何帮助!

更新:

这个问题现在似乎与相关实体无关。。。

我创建了一个新的实体ConnectionRequest,如下所示:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "CONNECTION_REQUEST_ID")
private Long id;

@Column(name = "FROM_ENTITY_ID", nullable = false)
private Long fromId;

@Column(name = "TO_ENTITY_ID", nullable = false)
private Long toId;

@Convert(converter = EntityTypeConverter.class)
@Column(name = "FROM_ENTITY_TYPE_ID", nullable = false)
private EntityType fromType;

@Convert(converter = EntityTypeConverter.class)
@Column(name = "TO_ENTITY_TYPE_ID", nullable = false)
private EntityType toType;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinColumn(name = "CONFERENCE_ID", nullable = false)
private Conference conference;

我可以发布一个新的ConnectionRequest记录,其中包含json中包含的会议关系,例如{"会议":".../会议/1"}

然而,我仍然收到了相同的例外情况,包括该实体的预订:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "RESERVATION_ID")
private Long id;

@Column(name = "DESCRIPTION", length = 50, nullable = false)
private String description;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DATE_MADE", nullable = false)
private Date dateMade;  

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "TIME_LAST_CHANGED")
private Date timeLastChanged;

@Column(name = "USER_LAST_CHANGED")
private Integer userLastChanged; // TODO why is this an int?

@Column(name = "ABSTRACT", length = 2000)
private String _abstract;

@Column(name = "COURSE_TYPE_ID")
private Integer courseTypeId;

@Column(name = "NUMBER_OF_CREDITS")
private Integer numCredits;

@Column(name = "INSTRUCTOR", length = 255)
private String instructor;

@Column(name = "NUMBER_OF_PARTICIPANTS")
private Integer numParticipants;

@Convert(converter = ReservationTypeConverter.class)
@Column(name = "RESERVATION_TYPE_ID", nullable = false)
private ReservationType reservationType;

@Convert(converter = StatusConverter.class)
@Column(name = "STATUS_ID") 
private Status status;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinColumn(name="REQUESTOR_USER_ID", nullable=false)
private User requestor;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinColumn(name="SUBMITTER_USER_ID", nullable=false)
private User submitter;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "reservation", cascade = {CascadeType.REMOVE})
private Set<Conference> conferences = new HashSet<>();

我不知道这门课有什么特别之处会导致事情出错...

共有1个答案

沈飞跃
2023-03-14

问题如下:

这两个不可发布的实体都有一个名为_abstract的属性,因为它是Java中的保留字。我分别为这个属性命名了getter和setter。

Jackson似乎一直在抛出空指针异常,因为getter和setter与属性名不匹配。

当我将属性名称更改为resvAbstract,并将访问器更新为getResvAbstract()和setResvAbstract()时,所有的东西都聚集在一起并开始工作。

我仍然对导致这个问题出现的变化感到好奇,但我很高兴它起到了作用!

 类似资料:
  • 使用放心,我们可以轻松执行GET,POST和其他方法。在下面的示例中,我们将 POST 发送到返回 JSON 响应的 API。 但是我需要创建具有复杂XML正文的POST请求。正文示例: 我该怎么做?提前感谢您

  • 当apk上载完成时出现问题,并显示以下消息: 由于以下原因无法发布此配置:禁止从14-18范围内的API级别升级到19+范围内的API级别的设备从版本10降级到版本9,当屏幕布局包含[small,normal,large,xlarge]中的任何一个,以及功能包含[Android.Hardware.Location、Android.Hardware.Location.GPS、Android.Hard

  • 如果这是重复的,我想提前向您道歉,但是,我在过去的两天里一直在四处寻找,没有找到任何解决我问题的方法。 我已经创建了一个web服务,我想向其发布一个JSON对象。我的问题如下: 假设我有三个对象。 如您所见,ObjectC引用了ObjectA和ObjectB,它们也引用了ObjectA。插入新ObjectC时,ObjectC. ObjtA应该与ObjectC. ObjtB. ObjtA相同。 PO

  • 我有ASP.NETCore C#web应用程序。我做了一些现在使用C#7.1功能的更改。我更改了项目版本,因此它可以编译和运行。但是,当我尝试发布项目时,我收到了一个错误: C# 7.0中没有“默认文本”功能。请使用语言版本7.1或更高版本。 我看到的编译命令是: 正如其他地方建议的那样,我安装了(v2.6.1),但没有任何区别。 是否有专门影响发布的 Visual Studio 设置? 更新:看

  • 看看这个简单的数据库查询方法,它给我发出警告关闭.. 所以,固定代码: 我感谢Luiggi为我指出了答案。

  • 我无法登录到已发布的apk,但调试apk工作正常。谷歌服务。发布的apk缺少json文件,我不知道为什么会这样。请有人帮我解决这个问题。下面我列出了我的应用程序级依赖项。 项目级依赖项 我得到这个错误请任何人帮帮我。