2012-12-04 2 views
2

저지를 사용하여 Java에서 REST API를 작성했습니다. XML 요청을 사용할 때 모든 것이 잘 작동하지만 JSON 요청을 사용할 때는 항상 JsonMappingException이 발생합니다.Java JsonMappingException 오류

개체는 xsd 파일의 Jaxb를 사용하여 생성됩니다. XML 요청이 작동 중이므로 생성 된 객체가 올바른 것으로 가정합니다.

내가 누락 된 내용을 누구에게 말해 줄 수 있습니까?

사전에

감사합니다 (하단에 오류 메시지의 WS, 객체 & 하나의 예를 들어 XSD를 찾을 수 있습니다).

오류 :

[#|2012-12-04T18:55:56.599+0100|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=29;_ThreadName=Thread-2;|StandardWrapperValve[ServletAdaptor]: PWC1406: Servlet.service() for servlet ServletAdaptor threw exception 
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class javax.xml.bind.JAXBElement<be.api.schema.sensorrequest.SensorCreateRequest>]: can not instantiate from JSON object (need to add/enable type information?) 
at [Source: [email protected]; line: 2, column: 1] 
     at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
     at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:740) 
     at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:683) 
     at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 
     at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695) 
     at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308) 
     at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419) 
     at com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139) 
     at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474) 
     at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) 
     at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) 
     at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) 
     at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:183) 
     at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
     at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
     at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
     at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
     at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
     at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
     at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
     at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
     at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
     at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
     at com.sun.grizzly.http.ajp.AjpProcessorTask.invokeAdapter(AjpProcessorTask.java:135) 
     at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
     at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
     at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
     at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
     at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
     at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
     at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
     at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
     at java.lang.Thread.run(Thread.java:662) 
|#] 

는 WS 구현 :

@POST 
    @Consumes(
    { 
     MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON 
    }) 
    @Produces(
    { 
     MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON 
    }) 
    @Validation(requestObject = SensorCreateRequest.class, xsd = "SensorRequest.xsd") 
    public SensorCreateResponse post(@TypeHint(SensorCreateRequest.class) JAXBElement<SensorCreateRequest> JAXBSensorCreateRequest, 
            @HeaderParam(value = "client") String clientName, 
            @HeaderParam(value = "session") String sessionToken) throws WebApplicationException 
    { 

    } 

요청 개체 (SensorCreateRequest)

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "SensorCreateRequestType", propOrder = { 

}) 
@XmlRootElement(name = "sensorCreateRequest") 
public class SensorCreateRequest implements Serializable, Equals, HashCode, ToString 
{ 

    @XmlElement(namespace = "http://www.api.be/schema/Sensor", required = true) 
    protected Sensors sensors; 

    /** 
    * Default no-arg constructor 
    * 
    */ 
    public SensorCreateRequest() { 
     super(); 
    } 

    /** 
    * Fully-initialising value constructor 
    * 
    */ 
    public SensorCreateRequest(final Sensors sensors) { 
     this.sensors = sensors; 
    } 

    //Getters, Setters, toString, hash & equals 

} 

는 센서 개체 :

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "SensorsType", propOrder = { 
    "sensors" 
}) 
@XmlRootElement(name = "sensors") 
public class Sensors implements Serializable, Equals, HashCode, ToString 
{ 

    @XmlElement(name = "sensor") 
    protected List<Sensor> sensors; 

    /** 
    * Default no-arg constructor 
    * 
    */ 
    public Sensors() { 
     super(); 
    } 

    /** 
    * Fully-initialising value constructor 
    * 
    */ 
    public Sensors(final List<Sensor> sensors) { 
     this.sensors = sensors; 
    } 

    //Getters, Setters, toString, hash & equals 

} 
012,351,

센서 개체 :

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "SensorType", propOrder = { 
    "sensorId", 
    "name", 
    "token", 
    "groups", 
    "locations", 
    "dataProfile", 
    "status", 
    "first", 
    "last", 
    "lastValue", 
    "longName", 
    "circles" 
}) 
@XmlRootElement(name = "sensor") 
public class Sensor implements Serializable, Equals, HashCode, ToString 
{ 

    protected int sensorId; 
    @XmlElement(required = true) 
    protected String name; 

    /** 
    * Default no-arg constructor 
    * 
    */ 
    public Sensor() { 
     super(); 
    } 

    /** 
    * Fully-initialising value constructor 
    * 
    */ 
    public Sensor(final int sensorId, final String name) { 
     this.sensorId = sensorId; 
     this.name = name; 
    } 

    //Getters, Setters, toString, hash & equals 

} 

SensorRequest의 xsd :

<?xml version="1.0" encoding="UTF-8"?> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.api.be/schema/SensorRequest" 
     xmlns:tns="http://www.api.be/schema/SensorRequest" 
     xmlns:s="http://www.api.be/schema/Sensor" 
     elementFormDefault="qualified"> 

    <xsd:import namespace="http://www.api.be/schema/Sensor" schemaLocation="Sensor.xsd"/> 

    <xsd:element name="sensorCreateRequest" type="tns:SensorCreateRequestType"/> 

    <xsd:complexType name="SensorCreateRequestType"> 
     <xsd:all> 
      <xsd:element ref="s:sensors" minOccurs="1" maxOccurs="1" /> 
     </xsd:all> 
    </xsd:complexType> 

</xsd:schema> 

센서의 xsd :

<?xml version="1.0" encoding="UTF-8"?> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.api.be/schema/Sensor" 
      xmlns:tns="http://www.api.be/schema/Sensor" 
      elementFormDefault="qualified"> 

    <!-- Sensor --> 
    <xsd:element name="sensors" type="tns:SensorsType"/> 

    <xsd:complexType name="SensorsType"> 
     <xsd:sequence> 
      <xsd:element name="sensor" type="tns:SensorType" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:element name="sensor" type="tns:SensorType" /> 

    <!-- Sensors --> 
    <xsd:complexType name="SensorType"> 
     <xsd:sequence> 
      <xsd:element name="sensorId" type="xsd:int" minOccurs="1" maxOccurs="1"/> 
      <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 
+0

나는 내가 WS에서 JAXBElement 첨부의 형식을 제거 할 때, 작동하는지 것을 발견했다. 그런 다음 JSON 및 XML 요청이 올바르게 구문 분석됩니다. JSON 파서가 JAXBElement와 함께 작동하도록 할 수있는 방법이 있습니까? – ToHe

답변

1

참고 :은 내가 EclipseLink JAXB (MOXy) 납과 회원의이야 JAXB (JSR-222) 전문가 그룹

JAXB (JSR-222) 사양은 JSON 바인딩에 대해 언급하지 않습니다. JAX-RS 제공자가 활용하는 여러 JSON 바인딩 구현은 JAXB 주석에서 JSON 표현을 파생시킬 수 있습니다. 귀하의 환경에서 Jackson을 사용하고 있습니다. Jackson은 JAXB 메타 데이터의 하위 집합을 지원하며 현재 JAXBElement 클래스를 지원하지 않습니다.잭슨 리드에서 다음과 같은 답변을 참조하십시오 :

는 EclipseLink JAXB (목시가)에 대한 지원을 제공합니다 모든 JAXB 우리 JSON 결합 구현에 구축하고 케이스를 사용하는 것이 더 잘 맞는을 할 수있다 :

어떤 officia에 대한 링크입니다 L 저지 예제 JSON 공급자로 활용 목시는 것을 :