Jetty Websockets的通用编码器和解码器

此人

如果我正在使用resteasy,则可以使用resteasy-jackson-provider来处理将我的对象编组为JSON,然后再将其编入我的其他终结点,例如:

@GET
@Path("/")
@Produces({MediaType.APPLICATION_JSON})
public MyThing getSingle() {
    return new MyThing();
}

这很好,因为这意味着我不需要为每种类型都指定编码器-Jackson会处理它。

我现在正在学习网络套接字,发现必须提供编码器:

@ServerEndpoint(value = "/websocket", encoders = {MyThingEncoder.class}, decoders = {MyThingDecoder.class})
public class Websocket {

    @OnOpen
    public void onOpen(Session session) {
            session.getBasicRemote().sendObject(new MyThing());
    }
}

这令人沮丧,因为我不想为每种单独的实体类型都提供编码器/解码器,尤其是当它们仅使用Jackson时。现在,我的编码器/解码器看起来像:

public class MyThingEncoder implements Encoder.Text<MyThing> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    public void init(EndpointConfig endpointConfig) {
    }

    @Override
    public void destroy() {
    }

    @Override
    public String encode(MyThing t) throws EncodeException {
        try {
            return MAPPER.writeValueAsString(t);
        } catch (IOException e) {
            throw new EncodeException(t, "Could not encode.", e);
        }
    }
}

我尝试通过将类定义更改为MyThingEncoder(如下)来使用泛型,但是它引发了异常(也在下面):

package com.jetnuts.serv.encoders;

import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.resteasy.util.Encode;

import javax.websocket.*;
import java.io.IOException;

public class MyThingEncoder<T> implements Encoder.Text<T> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    Class<T> typeOf;

    @Override
    public void init(EndpointConfig endpointConfig) {
    }

    @Override
    public void destroy() {
    }

    @Override
    public String encode(T t) throws EncodeException {
        try {
            return MAPPER.writeValueAsString(t);
        } catch (IOException e) {
            throw new EncodeException(t, "Could not encode.", e);
        }
    }
}

例外:

org.eclipse.jetty.websocket.api.InvalidWebSocketException: Invalid type declared for interface javax.websocket.Encoder$Text on class class com.jetnuts.serv.encoders.MyThingEncoder
    at org.eclipse.jetty.websocket.jsr356.metadata.EncoderMetadataSet.getEncoderType(EncoderMetadataSet.java:82)
    at org.eclipse.jetty.websocket.jsr356.metadata.EncoderMetadataSet.discover(EncoderMetadataSet.java:50)
    at org.eclipse.jetty.websocket.jsr356.metadata.CoderMetadataSet.addAll(CoderMetadataSet.java:78)
    at org.eclipse.jetty.websocket.jsr356.server.AnnotatedServerEndpointMetadata.<init>(AnnotatedServerEndpointMetadata.java:51)
    at org.eclipse.jetty.websocket.jsr356.server.ServerContainer.getServerEndpointMetadata(ServerContainer.java:162)
    at org.eclipse.jetty.websocket.jsr356.server.ServerContainer.addEndpoint(ServerContainer.java:87)
    at org.eclipse.jetty.websocket.jsr356.server.ServerContainer.doStart(ServerContainer.java:139)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:803)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:344)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1379)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1341)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:261)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:517)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41)
    at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188)
    at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499)
    at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
    at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:458)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
    at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610)
    at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529)
    at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392)
    at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

如何避免需要对要发送/接收的每种类型的对象执行完全相同的操作的编码器/解码器?

凯文·果酱
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.websocket.DecodeException;
import javax.websocket.Decoder;
import javax.websocket.EndpointConfig;
import java.io.IOException;
import java.io.Reader;

public class DataDecoder implements    Decoder.TextStream<Object> {

@Override
public Object decode(Reader reader) throws DecodeException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(reader, new TypeReference<Object>() {
    });

}

@Override
public void init(EndpointConfig config) {

}

@Override
public void destroy() {

}
}



@ClientEndpoint (decoders = { DataDecoder.class })
public class SomeClass  {


private WebSocketContainer container;

private Session session;
private Object objectModel;

@Override
public SomeType getAimedJobs() throws DatabaseException, ModuleNotLoadException, NamingException {



    SomeType someType = new SomeType ();
    ObjectMapper mapper = new ObjectMapper();
    try {
        String jsonInString =    mapper.writeValueAsString(this.objectModel);
        someType = mapper.readValue(jsonInString, SomeType.class);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return someType ;
}


@OnOpen
public void onOpen(Session session) {

    this.session = session;
}

@OnMessage
public void onMessage(Object o) {

    this.objectModel = o;
}

@OnClose
public void onClose(CloseReason reason) {

    System.out.println("WebSocket connection closed with CloseCode: " + reason.getCloseCode());
    this.session.Close();
}

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何加入编码器和解码器

来自分类Dev

在编码器和解码器 keras 上拆分自动编码器

来自分类Dev

什么是输入变压器的编码器和解码器BERT?

来自分类Dev

Tensorflow Keras 在自动编码器中分别使用编码器和解码器

来自分类Dev

用于复杂numpy数组的Json编码器和解码器

来自分类Dev

如何将websocket编码器和解码器指定为简单类

来自分类Dev

更改单词编码器和解码器以提供识别空间和标点符号

来自分类Dev

Apache camel netty定制编码器和解码器示例

来自分类Dev

更改单词编码器和解码器以提供识别空间和标点符号

来自分类Dev

如何定义带有circe的通用解码器/编码器?

来自分类Dev

如何将单独创建的编码器和解码器连接在一起?

来自分类Dev

HTML解码器和编码器

来自分类Dev

PHP Perl跨平台编码器/解码器

来自分类Dev

从Encog中的自动编码器抓取编码器/解码器

来自分类Dev

在Jetty中使用Websockets

来自分类Dev

你如何在 Siraj Raval 的 seq2seq 教程中使编码器隐藏单元和解码器隐藏单元的数量相等

来自分类Dev

在变分自动编码器中从解码器输入到编码器输出的反向传播

来自分类Dev

Jetty WebSockets SSL ==空错误

来自分类Dev

解码器的输出表面如何传递到编码器的输入表面?

来自分类Dev

找不到输出流#0:1的编码器(编解码器无)

来自分类Dev

是否有任何开源Netty Ldap编码器/解码器

来自分类Dev

SBT无法导入Kafka编码器/解码器类

来自分类Dev

AS3密码解码器和编码器(更好的答案?)

来自分类Dev

编码器-解码器LSTM模型给出了'nan'损失和预测

来自分类Dev

仅Maven错误:NoClassDefFoundError:伪装/编解码器/编码器

来自分类Dev

将多个.npy文件作为输入送入Keras编码器-解码器模型

来自分类Dev

C ++,FFMpeg:找不到任何解码器或编码器

来自分类Dev

可以使用VVC / VTM编码器/解码器支持编译ffmpeg吗?

来自分类Dev

嵌入式Jetty服务器

Related 相关文章

  1. 1

    如何加入编码器和解码器

  2. 2

    在编码器和解码器 keras 上拆分自动编码器

  3. 3

    什么是输入变压器的编码器和解码器BERT?

  4. 4

    Tensorflow Keras 在自动编码器中分别使用编码器和解码器

  5. 5

    用于复杂numpy数组的Json编码器和解码器

  6. 6

    如何将websocket编码器和解码器指定为简单类

  7. 7

    更改单词编码器和解码器以提供识别空间和标点符号

  8. 8

    Apache camel netty定制编码器和解码器示例

  9. 9

    更改单词编码器和解码器以提供识别空间和标点符号

  10. 10

    如何定义带有circe的通用解码器/编码器?

  11. 11

    如何将单独创建的编码器和解码器连接在一起?

  12. 12

    HTML解码器和编码器

  13. 13

    PHP Perl跨平台编码器/解码器

  14. 14

    从Encog中的自动编码器抓取编码器/解码器

  15. 15

    在Jetty中使用Websockets

  16. 16

    你如何在 Siraj Raval 的 seq2seq 教程中使编码器隐藏单元和解码器隐藏单元的数量相等

  17. 17

    在变分自动编码器中从解码器输入到编码器输出的反向传播

  18. 18

    Jetty WebSockets SSL ==空错误

  19. 19

    解码器的输出表面如何传递到编码器的输入表面?

  20. 20

    找不到输出流#0:1的编码器(编解码器无)

  21. 21

    是否有任何开源Netty Ldap编码器/解码器

  22. 22

    SBT无法导入Kafka编码器/解码器类

  23. 23

    AS3密码解码器和编码器(更好的答案?)

  24. 24

    编码器-解码器LSTM模型给出了'nan'损失和预测

  25. 25

    仅Maven错误:NoClassDefFoundError:伪装/编解码器/编码器

  26. 26

    将多个.npy文件作为输入送入Keras编码器-解码器模型

  27. 27

    C ++,FFMpeg:找不到任何解码器或编码器

  28. 28

    可以使用VVC / VTM编码器/解码器支持编译ffmpeg吗?

  29. 29

    嵌入式Jetty服务器

热门标签

归档