android – 使用spring数据rest创建带有引用的资源
作者:互联网
我正在使用spring数据休息,我有通过spring数据休息暴露的以下实体
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也包含医院对象.但新创建的捐赠请求和医院没有联系在一起.
邮递员中的以下类型的json不创建链接:
{
"bloodGroup":"AB+",
"hospital":{
"hospitalId":1
}
}
我知道以下json确实创建了链接:
{
"bloodGroup":"AB+",
"hospital":"/api/hospitals/1"
}
我的问题是如何使用第一种类型的json创建链接,因为这是从android客户端序列化dontaionRequest对象的自然方式?此外,我希望通过/ api /医院公开医院,因此不能选择移除休息资源.
解决方法:
它可以通过使用自定义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());
}
}
标签:android,spring-boot,spring-data-rest 来源: https://codeday.me/bug/20191003/1849826.html