2011-10-27 3 views
2

J'utilise Jackson avec mon application Spring. Lorsque Jackson convertit mes données JSON en un objet, cela me donne une erreur.Aucune méthode de créateur appropriée trouvée pour désérialiser à partir de chaîne JSON

Mes données JSON est que:

{"name":"sdfg","username":"dfgdg","password":"dfgdg","type":"A","protocol":"1","description":"sdfsdfdsf"}

Ma classe est que:

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); 
    } 
*/ 
} 

erreur comme suit:

org.codehaus.jackson.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: [email protected]; line: 1, column: 47] (through reference chain: com.a.a.a.Device["type"]) 
    org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160) 
    org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:210) 
    org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:530) 
    org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:356) 
    org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:230) 
    org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:334) 
    org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:495) 
    org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:351) 
    org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2131) 
    org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1455) 
    org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.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) 
+0

Peut-être est un doublon? http://stackoverflow.com/questions/3156962/problem-with-beans-and-jackson-library – Brambo

+0

Cela n'a pas aidé ma question – kamaci

Répondre

2

Exception explique exactement ce que le problème est le suivant: il ne sait pas comment convertir la chaîne "A" en valeur de type DeviceTyp e. La meilleure façon serait d'ajouter constructeur comme:

public DeviceType(String type) { .... } 

et les choses travailleraient.

0

Essayez ceci cela fonctionne

{ 
     "name": "sdfg", 
     "username": "dfgdg", 
     "password": "dfgdg", 
     "type": {"type_id":"1"}, 
     "protocol": {"protocol_id":"1"} 
} 
Questions connexes