当前位置: 首页 > 知识库问答 >
问题:

消息泽西岛自定义媒体类型的消息编写器

殳凯捷
2023-03-14

我一直在写RESTful Web服务。我使用的技术:

  • 玻璃鱼3(基于Java6)
  • JDK v7
  • Eclipse EE Kepler
  • 泽西岛(Glassfish的一部分)

我为自定义MediaType创建了自定义POJO:

public final class SimpleEntity{

private int value = 0;
private String stValue = "";

public SimpleEntity(){}

public SimpleEntity(int value, String stValue) {
    super();
    this.value = value;
    this.stValue = stValue;
}
... getters, setters

我的资源方法:

@POST
@Produces("application/entity")
@Path("/getSimpleEntityNeedsProvider")
public Response getSimpleEntityNeedsProvider(){
    SimpleEntity entity = new SimpleEntity(47, "String input value");

    return Response.ok().entity(entity).build();
}

我的邮件正文作者:

 @Provider
@Produces("application/entity")
public final class SimpleEntityBodyWriterProvider implements MessageBodyWriter<SimpleEntity>{

    private static Logger log = Logger.getLogger(Class.class);

    @Override
public long getSize(SimpleEntity arg0, Class arg1, Type arg2, Annotation[] arg3,
        MediaType arg4) {

    return -1;
}

@Override
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
        MediaType arg3) {
    if(arg0.equals(SimpleEntity.class)){            
        return true;
    }
    return false;
}

@Override
public void writeTo(SimpleEntity entity, Class arg1, Type arg2, Annotation[] arg3,
        MediaType media, MultivaluedMap arg5, OutputStream out)
        throws IOException, WebApplicationException {

    log.log(Level.INFO, "Input to SimpleEntityBodyWriterProvider: "+entity.getValue());

    out.write(entity.getValue());   
    out.write(entity.getStValue().getBytes());
}

}

我的服务客户:

private void getSimpleEntityNeedsProvider(String strUrl, String method){
    HttpURLConnection connect = null;
    try {
        URL url = new URL(strUrl);
        connect = (HttpURLConnection)url.openConnection();

        connect.setRequestProperty("Accept", "application/entity");// Accept from server
        connect.setRequestMethod(method);   
        connect.connect();

        InputStream input = connect.getInputStream();

        int size = input.available();
        byte[] b = new byte[size];
        input.read(b, 0, size);

        System.out.println("From resource: "+new String(b));

        System.out.println("Status: "+connect.getResponseCode()+" : "+connect.getResponseMessage());

    }
    catch(IOException e){
        e.printStackTrace();
    }
}

根路径:

    @ApplicationPath("/rest/v6")
public class AppV6 extends Application {
    private static Logger log = Logger.getLogger(Class.class.getName());
    public AppV6(){}

    @Override


public Set<Class<?>> getClasses(){
        Set<Class<?>> cls = new HashSet<>();
    cls.add(SimpleEntity.class);
    cls.add(SimpleEntityBodyWriterProvider.class);

    return cls;
}

}

当我运行应用程序时,我从我的服务客户端获得以下输出:

From resource: /String input value
Status: 200 : OK

我想使用自定义媒体类型和MessageBodyWriter,以便更好地了解RESTful/jer服务。我有的问题:

  • 这是涉及/编码自定义媒体类型的正确方式吗
  • 我在服务客户端收到的数据不完全正确。一、 例如,值必须是数字47,而不是“/”。那么,为什么我得到的是a字符而不是数字
  • 正如您在资源方法中看到的,我向自定义POJO输入了两个值:数字和字符串。在服务客户端,我有InputStream。我得到了整个数据的字节数组。如何将数据作为单独的数据块读取,这些数据在POJO中编码为字段?我可以一个字节一个字节地读,但这是一种正确的方法吗

共有1个答案

淳于博文
2023-03-14

我想出的解决办法很简单。我只需要为< code>InputStream使用包装类,即,

InputStream data = connect.getInputStream();
        DataInputStream input = new DataInputStream(data);

        System.out.println("From resource: "+input.readInt()+" : "+input.readUTF());

需要在< code>MessageBodyWriter实现类中应用相同的包装。我添加了< code>MessageBodyReader的实现(规则同上),用于在资源方法中读取自定义POJO/MediaType。工作起来很顺畅。

 类似资料:
  • 问题内容: 在尝试找出我的问题之后,我终于决定问您如何解决我的问题。我见过不同的人有相同的问题,我尝试了所有建议他们做的事情,但没有任何帮助解决我的问题。所以基本上我有一个使用Jersey进行构建的RESTful服务。对于我的客户,我想返回JSON格式的对象。我通读了不同的教程,并决定使用jersey- json-1.8库是有意义的。我像往常一样将所有内容添加到我的项目中,并尝试运行它,但是每次调

  • 我现在正在尝试泽西,按照这个链接在netbean中设置了一个网络服务。我有我的实体类和REST类。它可以从javafx2客户端添加、编辑、删除、请求对象(在本例中是用户对象)。 然而,现在我尝试向我的网络服务添加一个新方法来进行一些简单的身份验证。首先,我在Users.java文件中添加了一个新的命名查询(Users.login): 之后,我将以下代码添加到我的UsersFacadeREST.ja

  • 我的球衣测试课有一个奇怪的问题。 当执行我的测试代码并在org.glassfish.jersey.message.internal.ReaderInterceptorExecutor的第203行放置断点时,我看到我的阅读器不在reader.workers.但是,正如您在下面看到的,我在ResourceConfig中注册了这个MessageBodyReader。 所有相关代码如下所示。 是的,返回为

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Defining A Message Type 一节 首先我们来看一个非常简单的例子. 让我们假设你想定义一个搜索请求消息格式, 每个搜索请求有一个查询字符串, 搜索结果的第几页/每页结果数量. 这里是你用来定义消息类型的.proto文件: syntax = "proto3"; message SearchReques

  • 我正在使用Jersey构建REST服务,并希望返回一个< code >集合 但我的尝试失败了,但有以下例外: javax.ws.rs.WebApplicationException:com.sun.jersey.api。MessageException:Java类Java.util的消息体编写器。ArrayList和Java类型类Java.util。找不到ArrayList和MIME媒体类型tex

  • 简介 此消息 用来接收 用户自定义TOPIC消息 发送过来的事件。 消息体 ChannelMessageBean 例子 Kotlin @Subscribe(threadMode = ThreadMode.MAIN) fun onReceiveCustomMessage(customEvent: ChannelMessageBean) { // TODO } ChannelMessageB