我正在使用spring数据休息,我有通过spring data rest
公开的以下实体DonationRequest
@Data
@Entity
@Table(name="donation_request",schema="public")
public class DonationRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="donation_request_id")
Integer donationRequestId;
@Column(name="expiry_datetime")
Date expiryDatetime;
@Column(name="blood_group")
String bloodGroup;
@Column(name="no_of_bottles")
String noOfBottles;
@OneToOne
@JoinColumn(name="hospital_id")
Hospital hospital;
@OneToOne
@JoinColumn(name="user_data_id")
UserData requester;
@Column(name="active")
Boolean active;
}
医院
@Data
@Entity
@Table(name="hospital",schema="public")
public class Hospital {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="hospital_id")
Integer hospitalId;
@Column(name="name")
String name;
@Column(name="address")
String address;
@Column(name="loc",columnDefinition = "geometry")
Point loc;
}
现在我有一个Android客户端,它具有与上述相同的类定义。医院在Android客户端启动时缓存。现在我想在服务器上创建一个donationRequest实体。我可以通过将dononRequest对象的json发布到/ api / donationRequests来轻松实现。这个json也包含医院对象。但新创建的捐赠请求和医院没有联系在一起。
postman中的json类型不会创建链接:
{
"bloodGroup":"AB+",
"hospital":{
"hospitalId":1
}
}
我知道跟随json会创建链接:
{
"bloodGroup":"AB+",
"hospital":"/api/hospitals/1"
}
我的问题是如何使用第一种类型的json 创建链接,因为这是从android客户端序列化dontaionRequest对象的自然方式?此外,我希望医院通过/ api /医院公开,因此删除该休息资源不是一个选项。
答案 0 :(得分:2)
可以通过使用自定义HttpMessageConverter并定义自定义内容类型来实现,该内容类型可以是标准以外的任何内容(我使用的是application / mjson):
MHttpMessageConverter.java
public class MHttpMessageConverter implements HttpMessageConverter<Object>{
@Override
public boolean canRead(Class<?> aClass, MediaType mediaType) {
if (mediaType.getType().equalsIgnoreCase("application")
&& mediaType.getSubtype().equalsIgnoreCase("mjson"))
return true;
else
return false;
}
@Override
public boolean canWrite(Class<?> aClass, MediaType mediaType) {
return false;
}
@Override
public List<MediaType> getSupportedMediaTypes() {
return new ArrayList<>(Arrays.asList(MediaType.APPLICATION_JSON));
}
@Override
public Object read(Class<?> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(httpInputMessage.getBody(),aClass);
return obj;
}
@Override
public void write(Object o, MediaType mediaType, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
}
}
CustomRestConfiguration.java
@Configuration
public class CustomRestConfiguration extends RepositoryRestConfigurerAdapter {
@Override
public void configureHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
messageConverters.add(new MHttpMessageConverter());
}
}
答案 1 :(得分:0)
Spring Data REST正在使用HATEOAS。要引用相关资源,我们必须使用它们的链接:
先建立医院
{
//...
"_links": [
"hostpital": "http://localhost/api/hospitals/1",
//...
]
}
回复
POST /api/donationRequests
{
"bloodGroup":"AB+",
"hospital": "http://localhost/api/hospitals/1"
}
然后去医院&#39; (或&#39; self&#39;)链接并将其添加到“捐赠请求”中。有效载荷
POST /api/donationRequests
{
//...
}
另一种方法 - 创建第一个捐赠请求&#39;没有医院
{
//...
"_links": [
"hostpital": "http://localhost/api/donationRequests/1/hospital"
//...
]
}
响应
donationRequests/1/hospital
然后将医院PUT到PUT http://localhost/api/donationRequests/1/hospital (Content-Type: text/uri-list)
http://localhost/api/hospitals/1
使用有效负载中医院的文本链接(注意Content-Type:text / uri-list)
from google.datalab.ml import TensorBoard as tb
tb.start('./logs')
信息:Repository resources - The association resource
<强>更新强>
如果在没有资源链接的情况下进行交易是必要的,我们必须制作custom rest controller。