3131 * to any type that the {@link ConversionService} support via {@code byte[]}.
3232 *
3333 * @author Phillip Webb
34+ * @author Juergen Hoeller
3435 * @since 4.0
3536 */
3637final class ByteBufferConverter implements ConditionalGenericConverter {
@@ -40,8 +41,11 @@ final class ByteBufferConverter implements ConditionalGenericConverter {
4041 private static final TypeDescriptor BYTE_ARRAY_TYPE = TypeDescriptor .valueOf (byte [].class );
4142
4243 private static final Set <ConvertiblePair > CONVERTIBLE_PAIRS ;
44+
4345 static {
44- Set <ConvertiblePair > convertiblePairs = new HashSet <ConvertiblePair >();
46+ Set <ConvertiblePair > convertiblePairs = new HashSet <ConvertiblePair >(4 );
47+ convertiblePairs .add (new ConvertiblePair (ByteBuffer .class , byte [].class ));
48+ convertiblePairs .add (new ConvertiblePair (byte [].class , ByteBuffer .class ));
4549 convertiblePairs .add (new ConvertiblePair (ByteBuffer .class , Object .class ));
4650 convertiblePairs .add (new ConvertiblePair (Object .class , ByteBuffer .class ));
4751 CONVERTIBLE_PAIRS = Collections .unmodifiableSet (convertiblePairs );
@@ -63,13 +67,11 @@ public Set<ConvertiblePair> getConvertibleTypes() {
6367
6468 @ Override
6569 public boolean matches (TypeDescriptor sourceType , TypeDescriptor targetType ) {
70+ boolean byteBufferTarget = targetType .isAssignableTo (BYTE_BUFFER_TYPE );
6671 if (sourceType .isAssignableTo (BYTE_BUFFER_TYPE )) {
67- return matchesFromByteBuffer (targetType );
68- }
69- if (targetType .isAssignableTo (BYTE_BUFFER_TYPE )) {
70- return matchesToByteBuffer (sourceType );
72+ return (byteBufferTarget || matchesFromByteBuffer (targetType ));
7173 }
72- return false ;
74+ return ( byteBufferTarget && matchesToByteBuffer ( sourceType )) ;
7375 }
7476
7577 private boolean matchesFromByteBuffer (TypeDescriptor targetType ) {
@@ -84,10 +86,12 @@ private boolean matchesToByteBuffer(TypeDescriptor sourceType) {
8486
8587 @ Override
8688 public Object convert (Object source , TypeDescriptor sourceType , TypeDescriptor targetType ) {
87- if (sourceType .isAssignableTo (BYTE_BUFFER_TYPE )) {
88- return convertFromByteBuffer ((ByteBuffer ) source , targetType );
89+ boolean byteBufferTarget = targetType .isAssignableTo (BYTE_BUFFER_TYPE );
90+ if (source instanceof ByteBuffer ) {
91+ ByteBuffer buffer = (ByteBuffer ) source ;
92+ return (byteBufferTarget ? buffer .duplicate () : convertFromByteBuffer (buffer , targetType ));
8993 }
90- if (targetType . isAssignableTo ( BYTE_BUFFER_TYPE ) ) {
94+ if (byteBufferTarget ) {
9195 return convertToByteBuffer (source , sourceType );
9296 }
9397 // Should not happen
0 commit comments