2012-05-31 3 views
11

मैं सिर्फ अपनी मौजूदा स्प्रिंग + BlazeDS करने के लिए एक REST API जोड़ लिया है + सर्वर हाइबरनेट और सब कुछ जब डेटा पुनः प्राप्त और JSON के रूप में धारावाहिक है काम करने के लिए प्रकट होता है लेकिन जब मैं कोशिश करते हैं और पोस्ट डेटा डे होने के लिए एक पीओजेओ में serialized मुझे एक अपवाद मिलता है।जेसन मैपिंग अपवाद: जेएसओएन स्ट्रिंग से प्रकार [सरल प्रकार, ए.बी. कॉम्पैनी] के मूल्य को तुरंत चालू नहीं कर सकता; कोई एकल स्ट्रिंग निर्माता/कारखाने विधि

मैं इस धारणा के तहत था कि वसंत एनोटेशन और क्लास पथ में जैक्सन जार की मौजूदगी सभी की आवश्यकता होगी, कम से कम यह मेरी सूची के लिए था, सरल पैरामीटर वाले विधियों को हटाएं।

org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class com.twoh.dto.Company] from JSON String; no single-String constructor/factory method 

यहाँ विधि बुलाया जा रहा है:

public abstract class BaseEntityService<T extends BaseEntity> implements IBaseEntityService<T> { 

private IBaseEntityDAO<T> DAO; 

@Autowired 
private ValidationResultHelper validationResultHelper; 

public void setDAO(IBaseEntityDAO<T> DAO) { 
    this.DAO = DAO; 
} 

... 
@Secured("ROLE_USER") 
@RequestMapping(value="/create", method=RequestMethod.POST) 
public @ResponseBody ValidationResult create(@RequestBody T entity) { 
    ValidationResult result = null; 
    try { 
     result = DAO.persistEntity(entity); 
    } catch(JDBCException e) { 
     result = ExceptionHelper.getValidationResult(e); 
    } catch(DataIntegrityViolationException e) { 
     result = ExceptionHelper.getValidationResult(e); 
    } 
    validationResultHelper.log(DAO.getSession(), entity.getId(), entity.getClass(), result); 
    return result; 
} 
} 

और यहाँ पूर्ण अपवाद है:

org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class com.twoh.dto.Company] from JSON String; no single-String constructor/factory method 
at org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379) 
at org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268) 
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:759) 
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:585) 
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723) 
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1914) 
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:135) 
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:633) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:597) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:346) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 

अद्यतन: कंपनी का जोड़ा परिभाषा डीटीओ

@CheckDictionaryProperty.List({ 
    @CheckDictionaryProperty(propertyName="partyId", dictionaryName="Party") 
}) 
@Unique.List({ 
    @Unique(properties = {"code"}, message = "UNIQUE_CODE"), 
    @Unique(properties = {"name"}, message = "UNIQUE_NAME") 
}) 
@Entity 
@FXClass 
@Table(name="edrcompany") 
@JsonAutoDetect 
public class Company extends BaseEntity { 

    private static final long serialVersionUID = 1L; 

    public Company(){} 

    @NotBlank 
    @Column 
    private String name; 
    public String getName(){ return this.name; } 
    public void setName(String name){ this.name = name; } 

    @Column 
    private String code; 
    public String getCode() { return this.code; } 
    public void setCode(String code) { this.code = code; } 

    @NotNull 
    @Column(name="party_id") 
    private Integer partyId; 
    public Integer getPartyId() { return this.partyId; } 
    public void setPartyId(Integer partyId) { this.partyId = ValueHelper.isNullOrZero(partyId) ? null : partyId; } 

    @ElementCollection(targetClass=Integer.class, fetch=FetchType.EAGER) 
    @Fetch(FetchMode.SUBSELECT) 
    @CollectionTable(name="edrcompanyadminlink", joinColumns={@JoinColumn(name="company_id")}) 
    @Column(name="user_id") 
    private Collection<Integer> adminUserIdList = new HashSet<Integer>(); 
    public Collection<Integer> getAdminUserIdList() { return this.adminUserIdList; } 
    public void setAdminUserIdList (Collection<Integer> adminUserIdList) { this.adminUserIdList = adminUserIdList; }  


} 


@MappedSuperclass 
@FXClass 
public abstract class BaseEntity implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public BaseEntity(){} 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private Integer id; 
    public Integer getId() { return id; } 
    public void setId(Integer id) { this.id = ValueHelper.isNullOrZero(id) ? null : id; } 

    @Column(name="ENTITY_UID", unique=true, nullable=false, updatable=false, length=36) 
    /* Assign a default whenever this class is instantiated Hibernate will 
    * overwrite it when retrieving an entity from the DB. 
    */ 
    private String uid = UUID.randomUUID().toString(); 
    public String getUID() { return uid; }; 
    public void setUID(String uid) { this.uid = uid; } 

    @Version 
    @Column 
    private Integer version; 
    @FXIgnore 
    public Integer getVersion() { return this.version; } 
    public void setVersion(Integer version) { this.version = version; } 

    // Fake property so that DTO2FX will put it in 
    public String getClassName() { return this.getClass().getName(); } 
    @JsonIgnore 
    public void setClassName(String className) { throw new UnsupportedOperationException(); } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 

     if (o == null || !(o instanceof BaseEntity)) return false; 

     BaseEntity other = (BaseEntity) o; 

     // if the id is missing, return false 
     if (uid == null) return false; 

     // equivalence by uid 
     return uid.equals(other.getUID()); 
    } 

    @Override 
    public int hashCode() { 
     if (uid != null) { 
      return uid.hashCode(); 
     } else { 
      return super.hashCode(); 
     } 
    } 

    @Override 
    public String toString() { 
     return this.getClassName() + ": " + this.getId(); 
    } 

} 

अद्यतन अगर मैं डीटीओ में संशोधन इतना है कि जैक्सन Company.adminUserIdList संपत्ति तो रिकॉर्ड सफलतापूर्वक बन जाने पर ध्यान नहीं देता।

@JsonIgnore 
public Collection<Integer> getAdminUserIdList() { return this.adminUserIdList; } 
@JsonIgnore 
public void setAdminUserIdList (Collection<Integer> adminUserIdList) { this.adminUserIdList = adminUserIdList; }  

अद्यतन यहाँ के रूप में फ़ायर्फ़ॉक्स RESTClient का उपयोग कर

{ 
    "partyId":1, 
    "adminUserIdList":[21], 
    "name":"2H Mechanical LLC", 
    "code":null, 
    "uid":"fc5e15e7-a9a7-11e1-be90-7d08b05cbb96", 
    "id":1, 
    "className":"com.twoh.dto.Company", 
    "version":0 
} 

मैं एक ऐसी ही पद्धति का उपयोग कर रहा था (कम "id" और एक अलग "uid") /company/get/1 विधि द्वारा दिया Json है /compamy/createContent-type=application/json हेडर

+0

नहीं 'com.twoh.dto.Company' एक एकल स्ट्रिंग निर्माता त्रुटि संदेश के अनुसार होना चाहिए? – Stan

+0

संदेश का तात्पर्य यही है, लेकिन यदि यह स्वचालित रूप से जेएसओएन को क्रमबद्ध करता है तो दूसरी दिशा क्यों नहीं। अगर मुझे एक ऐसी विधि लिखनी है जो उस काम को करता है जो वस्तु को हराने के लिए लगता है। एक ऐसी ही सवाल http://stackoverflow.com/questions/8369260/jackson-throws-jsonmappingexception-on-deserialize-demands-single-string-constr है कि क्या किया गया था, लेकिन उदाहरण में से कोई भी मैं वसंत बाकी सेवाओं के देखा है में सुझाव है कि प्रत्येक पीओजेओ के लिए यह आवश्यक है। – hairyone

+0

क्या आप संभवतः com.twoh.dto.Company क्लास की घोषणा प्रदान कर सकते हैं? – Stan

उत्तर

11

के साथ कॉल करने के लिए मैंने JSON को ठीक करके एक ही समस्या हल की जिसे मैं सर्वर पर भेज रहा था; यह अमान्य था। मैंने अंतिम विशेषताओं के अंत में "," अक्षर हटा दिए और यह काम किया। मुझे आशा है कि यह

+2

मेरे लिए इसी तरह की समस्या ... मैं जेएसओ को पीओजेओ के खिलाफ मैप करने के लिए '{" मुद्रा ":" 1 "} के रूप में भेज रहा था, जिसे 'x id id =" 1 ">' xml प्रारूप में प्राप्त किया जाना चाहिए था। .. लेकिन मुझे इस धागे में बात की गई त्रुटि का सामना करना पड़ा ... जब तक कि मैंने अपना जेसन '{" मुद्रा "नहीं किया: {" id ":" 1 "}}' – pulkitsinghal

0

में मदद करता है मेरे मामले में, मैं शुरू लापता और घुंघराले ब्रेसिज़ समाप्त कर रही है।

संबंधित मुद्दे