使用spring data rest

时间:2017-09-18 07:53:30

标签: android spring-boot spring-data-rest

我正在使用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 /医院公开,因此删除该休息资源不是一个选项

2 个答案:

答案 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