2011-10-27 6 views
2

私はSpringアプリケーションでJacksonを使用します。 JacksonがJSONデータをオブジェクトに変換すると、エラーが発生します。JSON文字列からデシリアライズするのに適した作成者メソッドが見つかりません

私のJSONデータがあることで次のように

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

エラー:

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

を作品にこれを試してみてください? http://stackoverflow.com/questions/3156962/problem-with-beans-and-jackson-library – Brambo

+0

それは私の質問に役立たなかった – kamaci

答えて

2

例外は、問題がある正確に何を説明します。私のクラスはそれで

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

それは文字列 "A"をタイプDeviceTypの値に変換する方法を知らないe。

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

と物事がうまくいく: 最も簡単な方法は次のようにコンストラクタを追加することです。

0

それは多分これが重複している

{ 
     "name": "sdfg", 
     "username": "dfgdg", 
     "password": "dfgdg", 
     "type": {"type_id":"1"}, 
     "protocol": {"protocol_id":"1"} 
} 
関連する問題