You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Daniel Mikusa <dm...@gopivotal.com> on 2013/10/16 17:36:35 UTC
Tomcat 8 WebSocket Encoders / Decoders Questions
I have a simple WebSocket endpoint defined, it is just echoing the data sent by the client. Here's the code.
@ServerEndpoint(value="/websocket",
decoders={ListStringDecoder.class},
encoders={ListStringEncoder.class})
public static class Server {
@OnMessage
public List<String> rx(List<String> in) {
return in;
}
}
As you can see by the endpoint annotation, I'm defining an encoder and decoder. Here's the code for that.
public static class ListStringEncoder implements Encoder.Text<List<String>> {
@Override
public void init(EndpointConfig endpointConfig) {
}
@Override
public void destroy() {
}
@Override
public String encode(List<String> list) throws EncodeException {
return list.toString();
}
}
public static class ListStringDecoder implements Decoder.Text<List<String>> {
@Override
public void init(EndpointConfig endpointConfig) {
}
@Override
public void destroy() {
}
@Override
public List<String> decode(String data) throws DecodeException {
List<String> tmp = new ArrayList<String>();
for (String str : data.substring(1, data.length() - 1).split(",")) {
tmp.add(str);
}
return tmp;
}
@Override
public boolean willDecode(String s) {
return s.startsWith("[") && s.endsWith("]");
}
}
Now when I run this, I get the following exception as Tomcat starts up.
16-Oct-2013 11:29:40.311 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class org.apache.tomcat.websocket.pojo.TesterUtil$ServerConfigListener
java.lang.NullPointerException
at org.apache.tomcat.websocket.Util$DecoderMatch.<init>(Util.java:428)
at org.apache.tomcat.websocket.pojo.PojoMethodMapping$MessageHandlerInfo.<init>(PojoMethodMapping.java:396)
at org.apache.tomcat.websocket.pojo.PojoMethodMapping.<init>(PojoMethodMapping.java:114)
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:194)
at org.apache.tomcat.websocket.pojo.TesterUtil$ServerConfigListener.contextInitialized(TesterUtil.java:45)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4830)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5276)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1390)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
If I change my encoder & decoder to use "List" rather than "List<String>" everything works fine.
Any thoughts on what's going on here?
Thanks
Dan
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: Tomcat 8 WebSocket Encoders / Decoders Questions
Posted by Niki Dokovski <ni...@gmail.com>.
On Thu, Oct 17, 2013 at 12:46 AM, Niki Dokovski <ni...@gmail.com> wrote:
>
>
>
> On Wed, Oct 16, 2013 at 6:36 PM, Daniel Mikusa <dm...@gopivotal.com>wrote:
>
>> I have a simple WebSocket endpoint defined, it is just echoing the data
>> sent by the client. Here's the code.
>>
>> @ServerEndpoint(value="/websocket",
>> decoders={ListStringDecoder.class},
>> encoders={ListStringEncoder.class})
>> public static class Server {
>> @OnMessage
>> public List<String> rx(List<String> in) {
>> return in;
>> }
>> }
>>
>> As you can see by the endpoint annotation, I'm defining an encoder and
>> decoder. Here's the code for that.
>>
>> public static class ListStringEncoder implements
>> Encoder.Text<List<String>> {
>>
>> @Override
>> public void init(EndpointConfig endpointConfig) {
>> }
>>
>> @Override
>> public void destroy() {
>> }
>>
>> @Override
>> public String encode(List<String> list) throws EncodeException {
>> return list.toString();
>> }
>> }
>>
>> public static class ListStringDecoder implements
>> Decoder.Text<List<String>> {
>>
>> @Override
>> public void init(EndpointConfig endpointConfig) {
>> }
>>
>> @Override
>> public void destroy() {
>> }
>>
>> @Override
>> public List<String> decode(String data) throws DecodeException {
>> List<String> tmp = new ArrayList<String>();
>> for (String str : data.substring(1, data.length() -
>> 1).split(",")) {
>> tmp.add(str);
>> }
>> return tmp;
>> }
>>
>> @Override
>> public boolean willDecode(String s) {
>> return s.startsWith("[") && s.endsWith("]");
>> }
>> }
>>
>> Now when I run this, I get the following exception as Tomcat starts up.
>>
>> 16-Oct-2013 11:29:40.311 SEVERE [localhost-startStop-1]
>> org.apache.catalina.core.StandardContext.listenerStart Exception sending
>> context initialized event to listener instance of class
>> org.apache.tomcat.websocket.pojo.TesterUtil$ServerConfigListener
>> java.lang.NullPointerException
>> at
>> org.apache.tomcat.websocket.Util$DecoderMatch.<init>(Util.java:428)
>> at
>> org.apache.tomcat.websocket.pojo.PojoMethodMapping$MessageHandlerInfo.<init>(PojoMethodMapping.java:396)
>> at
>> org.apache.tomcat.websocket.pojo.PojoMethodMapping.<init>(PojoMethodMapping.java:114)
>> at
>> org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:194)
>> at
>> org.apache.tomcat.websocket.pojo.TesterUtil$ServerConfigListener.contextInitialized(TesterUtil.java:45)
>> at
>> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4830)
>> at
>> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5276)
>> at
>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>> at
>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1390)
>> at
>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1)
>> at
>> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> at
>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>> at
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> at java.lang.Thread.run(Thread.java:724)
>>
>> If I change my encoder & decoder to use "List" rather than "List<String>"
>> everything works fine.
>>
>> Any thoughts on what's going on here?
>>
>
> Hi Dan,
> IMHO current implementation of
> o.a.t.w.Util#getGenericType/getTypeParameter can be improved. More detailed
> inspection of the typed parameter will help. Your sample runs perfectly
> well on WebSocket RI implementation, hence I think this is a bug in Tomcat.
>
Bug report https://issues.apache.org/bugzilla/show_bug.cgi?id=55664
> cheers
> Niki
>
>
>>
>> Thanks
>>
>> Dan
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>>
>>
>
Re: Tomcat 8 WebSocket Encoders / Decoders Questions
Posted by Niki Dokovski <ni...@gmail.com>.
On Wed, Oct 16, 2013 at 6:36 PM, Daniel Mikusa <dm...@gopivotal.com>wrote:
> I have a simple WebSocket endpoint defined, it is just echoing the data
> sent by the client. Here's the code.
>
> @ServerEndpoint(value="/websocket",
> decoders={ListStringDecoder.class},
> encoders={ListStringEncoder.class})
> public static class Server {
> @OnMessage
> public List<String> rx(List<String> in) {
> return in;
> }
> }
>
> As you can see by the endpoint annotation, I'm defining an encoder and
> decoder. Here's the code for that.
>
> public static class ListStringEncoder implements
> Encoder.Text<List<String>> {
>
> @Override
> public void init(EndpointConfig endpointConfig) {
> }
>
> @Override
> public void destroy() {
> }
>
> @Override
> public String encode(List<String> list) throws EncodeException {
> return list.toString();
> }
> }
>
> public static class ListStringDecoder implements
> Decoder.Text<List<String>> {
>
> @Override
> public void init(EndpointConfig endpointConfig) {
> }
>
> @Override
> public void destroy() {
> }
>
> @Override
> public List<String> decode(String data) throws DecodeException {
> List<String> tmp = new ArrayList<String>();
> for (String str : data.substring(1, data.length() -
> 1).split(",")) {
> tmp.add(str);
> }
> return tmp;
> }
>
> @Override
> public boolean willDecode(String s) {
> return s.startsWith("[") && s.endsWith("]");
> }
> }
>
> Now when I run this, I get the following exception as Tomcat starts up.
>
> 16-Oct-2013 11:29:40.311 SEVERE [localhost-startStop-1]
> org.apache.catalina.core.StandardContext.listenerStart Exception sending
> context initialized event to listener instance of class
> org.apache.tomcat.websocket.pojo.TesterUtil$ServerConfigListener
> java.lang.NullPointerException
> at
> org.apache.tomcat.websocket.Util$DecoderMatch.<init>(Util.java:428)
> at
> org.apache.tomcat.websocket.pojo.PojoMethodMapping$MessageHandlerInfo.<init>(PojoMethodMapping.java:396)
> at
> org.apache.tomcat.websocket.pojo.PojoMethodMapping.<init>(PojoMethodMapping.java:114)
> at
> org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:194)
> at
> org.apache.tomcat.websocket.pojo.TesterUtil$ServerConfigListener.contextInitialized(TesterUtil.java:45)
> at
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4830)
> at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5276)
> at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> at
> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1390)
> at
> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1)
> at
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> at java.lang.Thread.run(Thread.java:724)
>
> If I change my encoder & decoder to use "List" rather than "List<String>"
> everything works fine.
>
> Any thoughts on what's going on here?
>
Hi Dan,
IMHO current implementation of o.a.t.w.Util#getGenericType/getTypeParameter
can be improved. More detailed inspection of the typed parameter will help.
Your sample runs perfectly well on WebSocket RI implementation, hence I
think this is a bug in Tomcat.
cheers
Niki
>
> Thanks
>
> Dan
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>
Re: [OT] Tomcat 8 WebSocket Encoders / Decoders Questions
Posted by Christopher Schultz <ch...@christopherschultz.net>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Dan,
On 10/16/13 11:36 AM, Daniel Mikusa wrote:
> If I change my encoder & decoder to use "List" rather than
> "List<String>" everything works fine.
Stupid Java and it's type-erasures. :(
As much as I really dislike most of the language-level features (which
amount to syntactic sugar in nearly all cases) that went into Java 1.5
and later, this is the one that irritates me the most: the fact that
generics just aren't. Instead, they are (albeit useful) merely
compiler hints for type safety, yet they have no bearing on runtime
behavior. Sun gets a FAIL on this one.
- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (Darwin)
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iQIcBAEBCAAGBQJSYDi/AAoJEBzwKT+lPKRY4nkP/iWI3NccXRaz/GErRql3xOO0
te/h1wFE3HWJz/a6FsmZ+Rx4AUjUDhrMhtkQsMkDK+zSzuClrVLcTKZ6Z73gmS70
6PRDLknuhDuqwy1WYk2SubDO2CLMGds/7zoMt+Q8PRtGZcbZ2/au8AFzEauNOOyg
8BAFfwXHA/L/YsEv3EsrPrK3nfBuAbP34Ff9Yg2WeXjPPajVjoSgmrHD35Aeza3z
UWzXVB5tTpQL9VrfDpj76NvX+/ls2cuIKkOqhh7og0Omc/O4YzdTJ5Y5vNZSvDH0
Vfy2YKWBpMLLMNFkD/vwPnBFgJ52Etxb65xR1Tolq0EExrFDYYnheiYNmmDB7JVX
HWWx1b2/qGZU5WQbVlhyDOUlNCBsAx6BjLHoZOpHeWXUnso1C5UpITUC6d6ngwkE
2XZfIPT4sMmbyMu6pvPTnTDhLBADEVZUIn4UelsV0GJC6bsjOIvgxYuPsb7LGsvL
o6tlFD/QbVQj5GrKHnkDoV+3AqFh80KDM3qpnOC06hKrcfqDl/5OVPVjeuMLeC7B
zVMXYwNoNQPsSuhU/D2owUhATMndkihiWQV69v4LN+rjg+BPswnryXlaIKMMLOaC
QEmqEXm3EdRbFZ0l2H50vj/IG5unorgSThSyLwA7LETZPIe05nRuYQgVGVTaYMlU
mO6RRXV+0MYw3B5yfvWC
=HsCS
-----END PGP SIGNATURE-----
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org