我对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设置为我的响应?
答案 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
,否则您无法选择。