On Wed, Oct 16, 2013 at 6:36 PM, Daniel Mikusa <[email protected]>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: [email protected]
> For additional commands, e-mail: [email protected]
>
>