如何为Spring集成提供转换器?

时间:2016-05-26 11:42:11

标签: java spring spring-integration

我对Spring集成很新,并且有下一个问题。我有下一个整合:

<int:channel id="channel"/>

<int:gateway id="api" service-interface="com.example.ApiGateway">
    <int:method name="getResponse"
                payload-expression="T(java.lang.String).format('${url}', #args[0])"
                request-channel="channel"/>
</int:gateway>

<int-http:outbound-gateway http-method="GET" url-expression="payload"
                           request-channel="channel"
                           expected-response-type="com.example.Response"/>

网关:

public interface ApiGateway {
    Response getResponse(final String id);
}

响应是小实体:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response
{
    @JsonProperty("id")
    private String id;
...
}

然后我为这个集成编写了单元测试,但它总是以

失败
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.lang.String to type com.example.Response

我已尝试在MappingJacksonHttpMessageConverter中将message-converters添加到int-http:outbound-gateway,但它无效。

所以我的问题是如何将转换器从json设置为我的响应?

2 个答案:

答案 0 :(得分:1)

我刚刚进行了测试,它对我来说很好用 - 您不需要配置自定义转换器,默认提供jackson转换器。

您是否将杰克逊罐子添加到了类路径中?

答案 1 :(得分:0)

好吧,看起来您的服务器没有返回正确的private string GetTypeName(TYPEDESC desc, ITypeInfo info) { var vt = (VarEnum)desc.vt; TYPEDESC tdesc; switch (vt) { case VarEnum.VT_PTR: tdesc = (TYPEDESC)Marshal.PtrToStructure(desc.lpValue, typeof(TYPEDESC)); return GetTypeName(tdesc, info); case VarEnum.VT_USERDEFINED: int href; unchecked { if (Marshal.SizeOf(typeof (IntPtr)) == sizeof (long)) { href = (int) desc.lpValue.ToInt64(); } else { href = desc.lpValue.ToInt32(); } } ITypeInfo refTypeInfo; info.GetRefTypeInfo(href, out refTypeInfo); return GetTypeName(refTypeInfo); case VarEnum.VT_CARRAY: tdesc = (TYPEDESC)Marshal.PtrToStructure(desc.lpValue, typeof(TYPEDESC)); return GetTypeName(tdesc, info) + "()"; default: string result; if (TypeNames.TryGetValue(vt, out result)) { return result; } break; } return "Object"; } private string GetTypeName(ITypeInfo info) { string typeName; string docString; // todo: put the docString to good use? int helpContext; string helpFile; info.GetDocumentation(-1, out typeName, out docString, out helpContext, out helpFile); return typeName; } HTTP标头。

这就是switch用于转换Content-Type内容以转换为所需POJO的方式。

如果只返回简单的MappingJacksonHttpMessageConverter,则除非收到简单的new MediaType("application", "*+json")并在之后使用text/plain,否则您无法选择。