使用JAX-RS中的InputStream参数返回自定义对象

时间:2017-09-12 12:34:55

标签: java jax-rs inputstream

我将Binary类型的对象存储在数据库中,我有一个JAX-RS Web服务,可以通过它们的ID检索它们。

public class Binary {
    private InputStream data;
    private String id;
    private String name;
    private String description;

    ... // constructors/getters/setters
}

我能够使用此代码:

@GET
@Path("{id}")
@Produces(MediaType.MULTIPART_FORM_DATA)
Response getBinary(@PathParam("id") String id) {
    Binary binary = ... // get binary from database
    FormDataMultiPart multipart = new FormDataMultiPart();
    multipart.field("name", binary.getName());
    multipart.field("description", binary.getDescription());
    multipart.field("data", app.getData(), 
    MediaType.APPLICATION_OCTET_STREAM_TYPE);

    return multipart;
}

我不喜欢在FormDataMultiPart中包装值并在客户端代码中解包它们。我想直接返回Binary对象,如下所示:

@GET
@Path("{id}")
@Produces(/* ? */)
Binary getBinary(@PathParam("id") String id) {
    Binary binary = ... // get binary from database

    return binary;
}

由于InputStream参数,我无法使用XML或JSON表示。 我很感激如何处理这个问题的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

如果您将数据作为InputStream,则每次从InputStream读取时都必须重置。最好把它作为byte []。

如果您使用的是jackson,则可以返回:

 Picasso.with(context)
                        .load(marker.getSnippet())
                        .placeholder(R.drawable.ic_placeholder)
                        .into(imageView, new Callback() {
                        @Override
                        public void onSuccess() {

                            if (currentClickedMarker != null && currentClickedMarker.isInfoWindowShown()) {
//toggle the marker's infoWindow
                                currentClickedMarker.hideInfoWindow();

                                currentClickedMarker.showInfoWindow();
                            }
                        }

                        @Override
                        public void onError() {

                        }
                    });

您可以使用以下方式进行测试:

@GET
@Path("{id}")
@Produces(/* ? */)
public Response get(String documentId) {
    Binary binary = ... // get binary from database
    return Response.ok(binary).build();
}