001/* 002 * Copyright 2002-2015 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * https://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.messaging.converter; 018 019import java.util.ArrayList; 020import java.util.Collection; 021import java.util.List; 022 023import org.springframework.messaging.Message; 024import org.springframework.messaging.MessageHeaders; 025import org.springframework.util.Assert; 026 027/** 028 * A {@link MessageConverter} that delegates to a list of registered converters 029 * to be invoked until one of them returns a non-null result. 030 * 031 * <p>As of 4.2.1, this composite converter implements {@link SmartMessageConverter} 032 * in order to support the delegation of conversion hints. 033 * 034 * @author Rossen Stoyanchev 035 * @author Juergen Hoeller 036 * @since 4.0 037 */ 038public class CompositeMessageConverter implements SmartMessageConverter { 039 040 private final List<MessageConverter> converters; 041 042 043 /** 044 * Create an instance with the given converters. 045 */ 046 public CompositeMessageConverter(Collection<MessageConverter> converters) { 047 Assert.notEmpty(converters, "Converters must not be empty"); 048 this.converters = new ArrayList<MessageConverter>(converters); 049 } 050 051 052 @Override 053 public Object fromMessage(Message<?> message, Class<?> targetClass) { 054 for (MessageConverter converter : getConverters()) { 055 Object result = converter.fromMessage(message, targetClass); 056 if (result != null) { 057 return result; 058 } 059 } 060 return null; 061 } 062 063 @Override 064 public Object fromMessage(Message<?> message, Class<?> targetClass, Object conversionHint) { 065 for (MessageConverter converter : getConverters()) { 066 Object result = (converter instanceof SmartMessageConverter ? 067 ((SmartMessageConverter) converter).fromMessage(message, targetClass, conversionHint) : 068 converter.fromMessage(message, targetClass)); 069 if (result != null) { 070 return result; 071 } 072 } 073 return null; 074 } 075 076 @Override 077 public Message<?> toMessage(Object payload, MessageHeaders headers) { 078 for (MessageConverter converter : getConverters()) { 079 Message<?> result = converter.toMessage(payload, headers); 080 if (result != null) { 081 return result; 082 } 083 } 084 return null; 085 } 086 087 @Override 088 public Message<?> toMessage(Object payload, MessageHeaders headers, Object conversionHint) { 089 for (MessageConverter converter : getConverters()) { 090 Message<?> result = (converter instanceof SmartMessageConverter ? 091 ((SmartMessageConverter) converter).toMessage(payload, headers, conversionHint) : 092 converter.toMessage(payload, headers)); 093 if (result != null) { 094 return result; 095 } 096 } 097 return null; 098 } 099 100 101 /** 102 * Return the underlying list of delegate converters. 103 */ 104 public List<MessageConverter> getConverters() { 105 return this.converters; 106 } 107 108 @Override 109 public String toString() { 110 return "CompositeMessageConverter[converters=" + getConverters() + "]"; 111 } 112 113}