मैं सिर्फ अपनी मौजूदा स्प्रिंग + 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/create
Content-type=application/json
हेडर
नहीं 'com.twoh.dto.Company' एक एकल स्ट्रिंग निर्माता त्रुटि संदेश के अनुसार होना चाहिए? – Stan
संदेश का तात्पर्य यही है, लेकिन यदि यह स्वचालित रूप से जेएसओएन को क्रमबद्ध करता है तो दूसरी दिशा क्यों नहीं। अगर मुझे एक ऐसी विधि लिखनी है जो उस काम को करता है जो वस्तु को हराने के लिए लगता है। एक ऐसी ही सवाल http://stackoverflow.com/questions/8369260/jackson-throws-jsonmappingexception-on-deserialize-demands-single-string-constr है कि क्या किया गया था, लेकिन उदाहरण में से कोई भी मैं वसंत बाकी सेवाओं के देखा है में सुझाव है कि प्रत्येक पीओजेओ के लिए यह आवश्यक है। – hairyone
क्या आप संभवतः com.twoh.dto.Company क्लास की घोषणा प्रदान कर सकते हैं? – Stan