java 找不到适合从 JSON 字符串反序列化的 Creator 方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7912982/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
No Suitable Creator Method Found To Deserialize From JSON String
提问by kamaci
I use Hymanson with my Spring application. When Hymanson converts my JSON data to an object it gives me an error.
我在 Spring 应用程序中使用 Hymanson。当 Hymanson 将我的 JSON 数据转换为一个对象时,它给了我一个错误。
My JSON data is that:
我的 JSON 数据是:
{"name":"sdfg","username":"dfgdg","password":"dfgdg","type":"A","protocol":"1","description":"sdfsdfdsf"}
{"name":"sdfg","username":"dfgdg","password":"dfgdg","type":"A","protocol":"1","description":"sdfsdfdsf"}
My class is that:
我的课是:
public class Device extends Name {
@Column
private String username;
@Column
private String password;
@JsonUnwrapped// I added this tag, not sure to use
@ManyToOne
private DeviceType type;
@JsonUnwrapped// I added this tag, not sure to use
@ManyToOne
private Protocol protocol;
...
//description and name are fields at Name that Device extends
//getters and setters
/* I tried that not sure:
@JsonProperty("protocol")
public void setProtocol(Protocol protocol) {
this.protocol = protocol;
}
*/
}
public class DeviceType extends Name {
private List<Protocol> supportedProtocols;
public List<Protocol> getSupportedProtocols() {
return supportedProtocols;
}
/*
I tried to add that:
@JsonProperty("type")
@Override
public void setName(String name) {
super.setName(name);
}
*/
}
public class Protocol extends Name {
/*
Nothing at this method. I added that for my purpose:
JsonProperty("protocol")
@Override
public void setName(String name) {
super.setName(name);
}
*/
}
Error as follows:
错误如下:
org.codehaus.Hymanson.map.JsonMappingException: Can not construct instance of com.a.a.a.DeviceType, problem: no suitable creator method found to deserialize from JSON String
at [Source: org.apache.catalina.connector.CoyoteInputStream@2fdaa156; line: 1, column: 47] (through reference chain: com.a.a.a.Device["type"])
org.codehaus.Hymanson.map.JsonMappingException.from(JsonMappingException.java:160)
org.codehaus.Hymanson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:210)
org.codehaus.Hymanson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:530)
org.codehaus.Hymanson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:356)
org.codehaus.Hymanson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:230)
org.codehaus.Hymanson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:334)
org.codehaus.Hymanson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:495)
org.codehaus.Hymanson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:351)
org.codehaus.Hymanson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2131)
org.codehaus.Hymanson.map.ObjectMapper.readValue(ObjectMapper.java:1455)
org.springframework.http.converter.json.MappingHymansonHttpMessageConverter.readInternal(MappingHymansonHttpMessageConverter.java:135)
org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:633)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:597)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:346)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:112)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
回答by StaxMan
Exception explains exactly what the problem is: it does not know how to convert String "A" into value of type DeviceType. The easiest way would be to add constructor like:
异常准确地解释了问题所在:它不知道如何将字符串“A”转换为 DeviceType 类型的值。最简单的方法是添加构造函数,如:
public DeviceType(String type) { .... }
and things would work.
事情会奏效的。
回答by garchva
Try this it works
试试这个它有效
{
"name": "sdfg",
"username": "dfgdg",
"password": "dfgdg",
"type": {"type_id":"1"},
"protocol": {"protocol_id":"1"}
}