From a156f67804f5a55cc1673ed298cec4f8defd534c Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Sun, 23 Sep 2012 17:01:31 +0900 Subject: [PATCH] [#624] Add varargs constructor to MessageToByteEncoder, MessageToMessage(Encoder|Decoder|Codec) to implement default isEncodable/isDecodable() .. and modify all their subtypes to take advantage of this improvement. --- .../codec/http/HttpChunkAggregator.java | 7 +--- .../codec/http/HttpContentDecoder.java | 6 +-- .../codec/http/HttpContentEncoder.java | 13 ++----- .../codec/http/HttpMessageEncoder.java | 6 +-- .../websocketx/WebSocket00FrameEncoder.java | 5 +-- .../websocketx/WebSocket08FrameEncoder.java | 9 ++--- .../handler/codec/spdy/SpdyFrameEncoder.java | 7 +--- .../handler/codec/spdy/SpdyHttpDecoder.java | 2 + .../handler/codec/spdy/SpdyHttpEncoder.java | 9 +---- .../codec/spdy/SpdySessionHandler.java | 14 +------ .../io/netty/handler/codec/CodecUtil.java | 37 +++++++++++++++++++ .../handler/codec/LengthFieldPrepender.java | 7 +--- .../handler/codec/MessageToByteEncoder.java | 8 +++- .../handler/codec/MessageToMessageCodec.java | 17 ++++++++- .../codec/MessageToMessageDecoder.java | 8 +++- .../codec/MessageToMessageEncoder.java | 8 +++- .../handler/codec/base64/Base64Decoder.java | 7 +--- .../handler/codec/base64/Base64Encoder.java | 7 +--- .../handler/codec/bytes/ByteArrayDecoder.java | 5 +-- .../handler/codec/bytes/ByteArrayEncoder.java | 9 ++--- .../codec/protobuf/ProtobufDecoder.java | 7 +--- .../codec/protobuf/ProtobufEncoder.java | 5 +-- .../ProtobufVarint32LengthFieldPrepender.java | 6 +-- .../CompatibleObjectEncoder.java | 7 +--- .../codec/serialization/ObjectEncoder.java | 5 +-- .../handler/codec/string/StringDecoder.java | 7 +--- .../handler/codec/string/StringEncoder.java | 11 ++---- .../example/factorial/NumberEncoder.java | 4 ++ 28 files changed, 123 insertions(+), 120 deletions(-) diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java index e175ffcdb9..c61bcd2ebb 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java @@ -66,6 +66,8 @@ public class HttpChunkAggregator extends MessageToMessageDecoder[] { HttpMessage.class }, + new Class[] { HttpMessage.class, HttpChunk.class }); } @Override @@ -74,11 +72,6 @@ public abstract class HttpContentEncoder extends MessageToMessageCodec { * Creates a new instance. */ protected HttpMessageEncoder() { - } - - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof HttpMessage || msg instanceof HttpChunk; + super(HttpMessage.class, HttpChunk.class); } @Override diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameEncoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameEncoder.java index 81d5cd1686..431d40c372 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameEncoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameEncoder.java @@ -32,9 +32,8 @@ import io.netty.handler.codec.MessageToByteEncoder; @Sharable public class WebSocket00FrameEncoder extends MessageToByteEncoder { - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof WebSocketFrame; + public WebSocket00FrameEncoder() { + super(WebSocketFrame.class); } @Override diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java index 1d77385229..937035b447 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java @@ -90,17 +90,14 @@ public class WebSocket08FrameEncoder extends MessageToByteEncoder { * Creates a new instance with the specified parameters. */ public SpdyFrameEncoder(int version, int compressionLevel, int windowBits, int memLevel) { + super(SpdyDataFrame.class, SpdyControlFrame.class); + if (version < SpdyConstants.SPDY_MIN_VERSION || version > SpdyConstants.SPDY_MAX_VERSION) { throw new IllegalArgumentException( "unknown version: " + version); @@ -74,11 +76,6 @@ public class SpdyFrameEncoder extends MessageToByteEncoder { }); } - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof SpdyDataFrame || msg instanceof SpdyControlFrame; - } - @Override public void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { if (msg instanceof SpdyDataFrame) { diff --git a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java index be61fc7ee1..d72aaf6cce 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java @@ -52,6 +52,8 @@ public class SpdyHttpDecoder extends MessageToMessageDecoder SpdyConstants.SPDY_MAX_VERSION) { throw new IllegalArgumentException( "unsupported version: " + version); diff --git a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpEncoder.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpEncoder.java index c413c09cbf..5ea2067883 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpEncoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpEncoder.java @@ -129,6 +129,8 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder { * @param version the protocol version */ public SpdyHttpEncoder(int version) { + super(HttpMessage.class, HttpChunk.class); + if (version < SpdyConstants.SPDY_MIN_VERSION || version > SpdyConstants.SPDY_MAX_VERSION) { throw new IllegalArgumentException( "unsupported version: " + version); @@ -136,13 +138,6 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder { spdyVersion = version; } - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof HttpRequest || - msg instanceof HttpResponse || - msg instanceof HttpChunk; - } - @Override public Object encode(ChannelHandlerContext ctx, Object msg) throws Exception { diff --git a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdySessionHandler.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdySessionHandler.java index 145c987601..57d8d969f2 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdySessionHandler.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdySessionHandler.java @@ -103,19 +103,7 @@ public class SpdySessionHandler break; } - if (msg instanceof SpdyDataFrame || - msg instanceof SpdySynStreamFrame || - msg instanceof SpdySynReplyFrame || - msg instanceof SpdyRstStreamFrame || - msg instanceof SpdySettingsFrame || - msg instanceof SpdyPingFrame || - msg instanceof SpdyGoAwayFrame || - msg instanceof SpdyHeadersFrame || - msg instanceof SpdyWindowUpdateFrame) { - handleInboundMessage(ctx, msg); - } else { - ctx.nextInboundMessageBuffer().add(msg); - } + handleInboundMessage(ctx, msg); } ctx.fireInboundBufferUpdated(); } diff --git a/codec/src/main/java/io/netty/handler/codec/CodecUtil.java b/codec/src/main/java/io/netty/handler/codec/CodecUtil.java index 43d8c76723..de26a0e266 100644 --- a/codec/src/main/java/io/netty/handler/codec/CodecUtil.java +++ b/codec/src/main/java/io/netty/handler/codec/CodecUtil.java @@ -82,6 +82,43 @@ final class CodecUtil { msg.getClass().getSimpleName())); } + private static final Class[] EMPTY_TYPES = new Class[0]; + + static Class[] acceptedMessageTypes(Class[] acceptedMsgTypes) { + if (acceptedMsgTypes == null) { + return EMPTY_TYPES; + } + + int numElem = 0; + for (Class c: acceptedMsgTypes) { + if (c == null) { + break; + } + numElem ++; + } + + Class[] newAllowedMsgTypes = new Class[numElem]; + for (int i = 0; i < numElem; i ++) { + newAllowedMsgTypes[i] = acceptedMsgTypes[i]; + } + + return newAllowedMsgTypes; + } + + static boolean acceptMessage(Class[] acceptedMsgTypes, Object msg) { + if (acceptedMsgTypes.length == 0) { + return true; + } + + for (Class c: acceptedMsgTypes) { + if (c.isInstance(msg)) { + return true; + } + } + + return false; + } + private CodecUtil() { // Unused } diff --git a/codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java b/codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java index 46763ea5f4..83cceab485 100644 --- a/codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java +++ b/codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java @@ -83,6 +83,8 @@ public class LengthFieldPrepender extends MessageToByteEncoder { */ public LengthFieldPrepender( int lengthFieldLength, boolean lengthIncludesLengthFieldLength) { + super(ByteBuf.class); + if (lengthFieldLength != 1 && lengthFieldLength != 2 && lengthFieldLength != 3 && lengthFieldLength != 4 && lengthFieldLength != 8) { @@ -95,11 +97,6 @@ public class LengthFieldPrepender extends MessageToByteEncoder { this.lengthIncludesLengthFieldLength = lengthIncludesLengthFieldLength; } - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof ByteBuf; - } - @Override public void encode( ChannelHandlerContext ctx, diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToByteEncoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToByteEncoder.java index 567ac9f0b7..92b0536485 100644 --- a/codec/src/main/java/io/netty/handler/codec/MessageToByteEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/MessageToByteEncoder.java @@ -23,6 +23,12 @@ import io.netty.channel.ChannelOutboundMessageHandlerAdapter; public abstract class MessageToByteEncoder extends ChannelOutboundMessageHandlerAdapter { + private final Class[] acceptedMsgTypes; + + protected MessageToByteEncoder(Class... acceptedMsgTypes) { + this.acceptedMsgTypes = CodecUtil.acceptedMessageTypes(acceptedMsgTypes); + } + @Override public void flush(ChannelHandlerContext ctx, ChannelFuture future) throws Exception { MessageBuf in = ctx.outboundMessageBuffer(); @@ -61,7 +67,7 @@ public abstract class MessageToByteEncoder extends ChannelOutboundMessageHand * @param msg the message */ public boolean isEncodable(Object msg) throws Exception { - return true; + return CodecUtil.acceptMessage(acceptedMsgTypes, msg); } public abstract void encode(ChannelHandlerContext ctx, I msg, ByteBuf out) throws Exception; diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageCodec.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageCodec.java index 8ff57491bb..d86e6c5cfe 100644 --- a/codec/src/main/java/io/netty/handler/codec/MessageToMessageCodec.java +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageCodec.java @@ -53,6 +53,19 @@ public abstract class MessageToMessageCodec[] acceptedInboundMsgTypes; + private final Class[] acceptedOutboundMsgTypes; + + protected MessageToMessageCodec() { + this(null, null); + } + + protected MessageToMessageCodec( + Class[] acceptedInboundMsgTypes, Class[] acceptedOutboundMsgTypes) { + this.acceptedInboundMsgTypes = CodecUtil.acceptedMessageTypes(acceptedInboundMsgTypes); + this.acceptedOutboundMsgTypes = CodecUtil.acceptedMessageTypes(acceptedOutboundMsgTypes); + } + @Override public MessageBuf newInboundBuffer(ChannelHandlerContext ctx) throws Exception { return decoder.newInboundBuffer(ctx); @@ -80,7 +93,7 @@ public abstract class MessageToMessageCodec extends ChannelInboundHandlerAdapter implements ChannelInboundMessageHandler { + private final Class[] acceptedMsgTypes; + + protected MessageToMessageDecoder(Class... acceptedMsgTypes) { + this.acceptedMsgTypes = CodecUtil.acceptedMessageTypes(acceptedMsgTypes); + } + @Override public MessageBuf newInboundBuffer(ChannelHandlerContext ctx) throws Exception { return Unpooled.messageBuffer(); @@ -77,7 +83,7 @@ public abstract class MessageToMessageDecoder * @param msg the message */ public boolean isDecodable(Object msg) throws Exception { - return true; + return CodecUtil.acceptMessage(acceptedMsgTypes, msg); } public abstract O decode(ChannelHandlerContext ctx, I msg) throws Exception; diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java index 3b22fc6c3d..cbc0be41ee 100644 --- a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java @@ -22,6 +22,12 @@ import io.netty.channel.ChannelOutboundMessageHandlerAdapter; public abstract class MessageToMessageEncoder extends ChannelOutboundMessageHandlerAdapter { + private final Class[] acceptedMsgTypes; + + protected MessageToMessageEncoder(Class... acceptedMsgTypes) { + this.acceptedMsgTypes = CodecUtil.acceptedMessageTypes(acceptedMsgTypes); + } + @Override public void flush(ChannelHandlerContext ctx, ChannelFuture future) throws Exception { MessageBuf in = ctx.outboundMessageBuffer(); @@ -65,7 +71,7 @@ public abstract class MessageToMessageEncoder extends ChannelOutboundMessa * @param msg the message */ public boolean isEncodable(Object msg) throws Exception { - return true; + return CodecUtil.acceptMessage(acceptedMsgTypes, msg); } public abstract O encode(ChannelHandlerContext ctx, I msg) throws Exception; diff --git a/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java b/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java index 985bcfdc12..e820483a4d 100644 --- a/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java +++ b/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java @@ -53,17 +53,14 @@ public class Base64Decoder extends MessageToMessageDecoder { } public Base64Decoder(Base64Dialect dialect) { + super(ByteBuf.class); + if (dialect == null) { throw new NullPointerException("dialect"); } this.dialect = dialect; } - @Override - public boolean isDecodable(Object msg) throws Exception { - return msg instanceof ByteBuf; - } - @Override public ByteBuf decode(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { return Base64.decode(msg, msg.readerIndex(), msg.readableBytes(), dialect); diff --git a/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java b/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java index c90790f745..8d95fc9fba 100644 --- a/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java +++ b/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java @@ -54,6 +54,8 @@ public class Base64Encoder extends MessageToMessageEncoder { } public Base64Encoder(boolean breakLines, Base64Dialect dialect) { + super(ByteBuf.class); + if (dialect == null) { throw new NullPointerException("dialect"); } @@ -62,11 +64,6 @@ public class Base64Encoder extends MessageToMessageEncoder { this.dialect = dialect; } - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof ByteBuf; - } - @Override public ByteBuf encode(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { diff --git a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java index 50f00a99b2..300dabe263 100644 --- a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java @@ -49,9 +49,8 @@ import io.netty.handler.codec.MessageToMessageDecoder; */ public class ByteArrayDecoder extends MessageToMessageDecoder { - @Override - public boolean isDecodable(Object msg) throws Exception { - return msg instanceof ByteBuf; + public ByteArrayDecoder() { + super(ByteBuf.class); } @Override diff --git a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java index 93e91567ec..87eb79112a 100644 --- a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java @@ -51,14 +51,13 @@ import io.netty.handler.codec.MessageToMessageEncoder; */ public class ByteArrayEncoder extends MessageToMessageEncoder { - @Override - public MessageBuf newOutboundBuffer(ChannelHandlerContext ctx) throws Exception { - return Unpooled.messageBuffer(); + public ByteArrayEncoder() { + super(byte[].class); } @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof byte[]; + public MessageBuf newOutboundBuffer(ChannelHandlerContext ctx) throws Exception { + return Unpooled.messageBuffer(); } @Override diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java index 77b940e992..3320fc432e 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java @@ -74,6 +74,8 @@ public class ProtobufDecoder extends MessageToMessageDecoder { - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof MessageLite || msg instanceof MessageLite.Builder; + public ProtobufEncoder() { + super(MessageLite.class, MessageLite.Builder.class); } @Override diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java index 98ecb47113..0a5c89f120 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java @@ -44,11 +44,7 @@ public class ProtobufVarint32LengthFieldPrepender extends MessageToByteEncoder { * the long term. */ public CompatibleObjectEncoder(int resetInterval) { + super(Serializable.class); + if (resetInterval < 0) { throw new IllegalArgumentException( "resetInterval: " + resetInterval); @@ -75,11 +77,6 @@ public class CompatibleObjectEncoder extends MessageToByteEncoder { return new ObjectOutputStream(out); } - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof Serializable; - } - @Override public void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { Attribute oosAttr = ctx.attr(OOS); diff --git a/codec/src/main/java/io/netty/handler/codec/serialization/ObjectEncoder.java b/codec/src/main/java/io/netty/handler/codec/serialization/ObjectEncoder.java index 9205635990..96e620d622 100644 --- a/codec/src/main/java/io/netty/handler/codec/serialization/ObjectEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/serialization/ObjectEncoder.java @@ -39,9 +39,8 @@ import java.io.Serializable; public class ObjectEncoder extends MessageToByteEncoder { private static final byte[] LENGTH_PLACEHOLDER = new byte[4]; - @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof Serializable; + public ObjectEncoder() { + super(Serializable.class); } @Override diff --git a/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java b/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java index f8528cdac5..6e955f3e12 100644 --- a/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java @@ -68,17 +68,14 @@ public class StringDecoder extends MessageToMessageDecoder { * Creates a new instance with the specified character set. */ public StringDecoder(Charset charset) { + super(ByteBuf.class); + if (charset == null) { throw new NullPointerException("charset"); } this.charset = charset; } - @Override - public boolean isDecodable(Object msg) throws Exception { - return msg instanceof ByteBuf; - } - @Override public String decode(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { return msg.toString(charset); diff --git a/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java b/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java index 795c6b46b4..91faa5c029 100644 --- a/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java @@ -50,7 +50,7 @@ import java.nio.charset.Charset; * @apiviz.landmark */ @Sharable -public class StringEncoder extends MessageToMessageEncoder { +public class StringEncoder extends MessageToMessageEncoder { // TODO Use CharsetEncoder instead. private final Charset charset; @@ -66,6 +66,8 @@ public class StringEncoder extends MessageToMessageEncoder { * Creates a new instance with the specified character set. */ public StringEncoder(Charset charset) { + super(CharSequence.class); + if (charset == null) { throw new NullPointerException("charset"); } @@ -73,12 +75,7 @@ public class StringEncoder extends MessageToMessageEncoder { } @Override - public boolean isEncodable(Object msg) throws Exception { - return msg instanceof String; - } - - @Override - public ByteBuf encode(ChannelHandlerContext ctx, String msg) throws Exception { + public ByteBuf encode(ChannelHandlerContext ctx, CharSequence msg) throws Exception { return Unpooled.copiedBuffer(msg, charset); } } diff --git a/example/src/main/java/io/netty/example/factorial/NumberEncoder.java b/example/src/main/java/io/netty/example/factorial/NumberEncoder.java index 4fcd80adbc..ebe79f3e9e 100644 --- a/example/src/main/java/io/netty/example/factorial/NumberEncoder.java +++ b/example/src/main/java/io/netty/example/factorial/NumberEncoder.java @@ -28,6 +28,10 @@ import java.math.BigInteger; */ public class NumberEncoder extends MessageToByteEncoder { + public NumberEncoder() { + super(Number.class); + } + @Override public void encode( ChannelHandlerContext ctx, Number msg, ByteBuf out) throws Exception {