Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jersey 如何在我的客户端中注册我的自定义MessageBodyReader?_Jersey - Fatal编程技术网

Jersey 如何在我的客户端中注册我的自定义MessageBodyReader?

Jersey 如何在我的客户端中注册我的自定义MessageBodyReader?,jersey,Jersey,也许有人能帮我找到解决办法 我正在使用jersey apache客户端1.17 我尝试使用Jersey client构建一个独立的应用程序(没有Servlet容器或其他什么,只有Java类),它与RESTFUL API通信,在我尝试处理服务器发送的csv流mediatype“text/csv;charset=utf-8”之前,一切都很好 问题是,我可以使用以下代码读取此流: InputStreamReader reader = new InputStreamReader(itemExpo

也许有人能帮我找到解决办法

我正在使用jersey apache客户端1.17

我尝试使用Jersey client构建一个独立的应用程序(没有Servlet容器或其他什么,只有Java类),它与RESTFUL API通信,在我尝试处理服务器发送的csv流mediatype“text/csv;charset=utf-8”之前,一切都很好

问题是,我可以使用以下代码读取此流:

    InputStreamReader reader = new InputStreamReader(itemExportBuilder
            .get(ClientResponse.class).getEntityInputStream());
    Csv csv = new Csv();
    Input input = csv.createInput(reader);
    try {
        String[] readLine;
        while ((readLine = input.readLine()) != null) {
            LOG.debug("Reading CSV: {}", readLine);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        input.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
但我想将其封装并放入MessageBodyReader中。但是在编写了这段代码之后,我无法让客户端使用以下类:

package client.response;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Provider
public class ItemExportMessageBodyReader implements MessageBodyReader<ItemExportResponse> {

private static final Logger LOG = LoggerFactory.getLogger(ItemExportMessageBodyReader.class);

private static final Integer SKU = 0;
private static final Integer BASE_SKU = 1;

public boolean isReadable(Class<?> paramClass, Type type, Annotation[] annotations,
        MediaType mediaType) {
    LOG.info("Cheking if content is readable or not");
    return paramClass == ItemExportResponse.class && !mediaType.isWildcardType()
            && !mediaType.isWildcardSubtype()
            && mediaType.isCompatible(MediaType.valueOf("text/csv; charset=utf-8"));
}

public ItemExportResponse readFrom(Class<ItemExportResponse> paramClass, Type paramType,
        Annotation[] paramArrayOfAnnotation, MediaType paramMediaType,
        MultivaluedMap<String, String> paramMultivaluedMap, InputStream entityStream)
        throws IOException, WebApplicationException {
    InputStreamReader reader = new InputStreamReader(entityStream);
    Csv csv = new Csv();
    Input input = csv.createInput(reader);
    List<Item> items = new ArrayList<Item>();
    try {
        String[] readLine;
        while ((readLine = input.readLine()) != null) {
            LOG.trace("Reading CSV: {}", readLine);
            Item item = new Item();
            item.setBaseSku(readLine[BASE_SKU]);
            items.add(item);
        }
    } catch (IOException e) {
        LOG.warn("Item export HTTP response handling failed", e);
    } finally {
        try {
            input.close();
        } catch (IOException e) {
            LOG.warn("Could not close the HTTP response stream", e);
        }
    }
    ItemExportResponse response = new ItemExportResponse();
    response.setItems(items);
    return response;
}
现在的问题是我不能使用ClientBuilder。我必须从以另一种方式构造客户机的特定类进行扩展,并且我无权更改构造

因此,当我从服务器收到响应时,客户端失败,出现以下异常:

com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class client.response.ItemExportResponse, and Java type class client.response.ItemExportResponse, and MIME media type text/csv; charset=utf-8 was not found

还有其他方法注册我的MessageBodyReader吗?

好的。如果有人碰到我的问题,我通过从Jersey 1.17升级到2.9版解决了这个谜。我上面链接的文档也涵盖了这个版本,而不是旧版本,这就是造成混淆的原因

Jersey从版本2开始引入了向后不兼容的更改,所以我不知道如何在版本1.17中配置它


在版本2中,建议的解决方案运行良好。

但在我的例子中,Jersey 2.x对于1.x Jersey客户端运行良好。
com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class client.response.ItemExportResponse, and Java type class client.response.ItemExportResponse, and MIME media type text/csv; charset=utf-8 was not found