当使用spring cloud netflix的伪客户端从一个微服务向另一个微服务发出发布请求时,Postman中出现以下错误:
{
"timestamp": 1506933777413,
"status": 500,
"error": "Internal Server Error",
"exception": "feign.codec.EncodeException",
"message": "Could not write JSON: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile[\"inputStream\"]->java.io.FileInputStream[\"fd\"])",
"path": "/attachments"
}
我的eclipse控制台显示以下异常:
com.fasterxml.jackson.databind.JsonMappingException:未找到类java.io.FileDescriptor的序列化程序,也未找到创建BeanSerializer的属性(为避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过参考链:org.springframework.web.multipart。 support.StandardMultipartHttpServletRequest $ StandardMultipartFile [“ inputStream”]-> java.io.FileInputStream [“ fd”]),位于com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284)〜[jackson-databind-2.8。 com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110)的[jar.2.8.9]〜com.fasterxml.jackson的[jackson-databind-2.8.9.jar:2.8.9]。 databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135)〜[jackson-databind-2.8.9.jar:2.8.9]位于com.fasterxml.jackson。databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69)〜[jackson-databind-2.8.9.jar:2.8.9] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer .java:32)〜[jackson-databind-2.8.9.jar:2.8.9],位于com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704)〜[jackson-databind-2.8。 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689)的9.jar:2.8.9]〜com的[jackson-databind-2.8.9.jar:2.8.9]。 fastxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)〜[jackson-databind-2.8.9.jar:2.8.9] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter .java:704)〜[jackson-databind-2.8.9.jar:2.8.9],位于com.fasterxml.jackson.databind.ser.std.BeanSerializerBase。serializeFields(BeanSerializerBase.java:689)〜[jackson-databind-2.8.9.jar:2.8.9]在com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)〜[jackson-databind -2.8.9.jar:2.8.9]在com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)〜[jackson-databind-2.8.9.jar:2.8.9]在com .fasterxml.jackson.databind.ObjectWriter $ Prefetch.serialize(ObjectWriter.java:1429)〜[jackson-databind-2.8.9.jar:2.8.9]位于com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter。 java:951)〜[jackson-databind-2.8.9.jar:2.8.9]serializeValue(DefaultSerializerProvider.java:292)〜[jackson-databind-2.8.9.jar:2.8.9] at com.fasterxml.jackson.databind.ObjectWriter $ Prefetch.serialize(ObjectWriter.java:1429)〜[jackson-databind -2.8.9.jar:2.8.9],位于com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:951)〜[jackson-databind-2.8.9.jar:2.8.9]serializeValue(DefaultSerializerProvider.java:292)〜[jackson-databind-2.8.9.jar:2.8.9] at com.fasterxml.jackson.databind.ObjectWriter $ Prefetch.serialize(ObjectWriter.java:1429)〜[jackson-databind -2.8.9.jar:2.8.9],位于com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:951)〜[jackson-databind-2.8.9.jar:2.8.9]
更新1
这是我的假装界面:
@FeignClient(name="attachment-service", fallback=AttachmentHystrixFallback.class)
public interface AttachmentFeignClient {
@RequestMapping("upload")
void upload(@RequestPart(name="file") MultipartFile file, @RequestParam(name="attachableId") Long attachableId,
@RequestParam(name="className") String className, @RequestParam(name="appName") String appName);
这是主要的微服务控制器:
@RestController
public class AttachmentController implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4431842080646836475L;
@Autowired
AttachmentService attachmentService;
@RequestMapping(value = "attachments", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public void upload(@RequestPart MultipartFile file, @RequestParam Long attachableId, @RequestParam String className, @RequestParam String appName) throws Exception {
attachmentService.uploadFile(file, attachableId, className, appName);
}
}
我肯定在这里缺少某种串行器。
任何建议将不胜感激!
谢谢
经过几天的寻找解决方案,我发现了这一点。您应该开始为spring依赖添加伪装形式:
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.3.0</version>
</dependency
然后您的假客户需要这个spring表格编码器:
@FeignClient(name="attachment-service", configuration = {AttachmentFeignClient.MultipartSupportConfig.class}
fallback=AttachmentHystrixFallback.class)
public interface AttachmentFeignClient {
@RequestMapping(value= {"upload"}, consumes = {"multipart/form-data"})
void upload(@RequestPart(name="file") MultipartFile file, @RequestParam(name="attachableId") Long attachableId,
@RequestParam(name="className") String className, @RequestParam(name="appName") String appName);
public class MultipartSupportConfig {
@Bean
@Primary
@Scope("prototype")
public Encoder feignFormEncoder() {
return new SpringFormEncoder();
}
}
}
希望对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句