2012-03-15 19 views
5

サービスにXMLデータを正常に投稿できますが、JSONを使用してXMLデータを送信しようとしても失敗しています。 POJOは、次のとおりです。Jersey RESTサービスへのJSONリクエストのPOST方法

@XmlRootElement 
public class Address { 
    String city; 
    String zip; 
    //Getters & setters... 
} 

サービス・リソースは、次のように私はPOSTをやっている

@POST 
@Produces("application/json") 
public Address fix(Address a) { 
    return a; 
} 

:サーバーが400不正な要求に応答している

POST /AcmeWeb/svc/simple HTTP/1.1 
Content-Length: 30 
Content-Type: application/json; charset=UTF-8 

{"city":"Miami","zip":"33130"} 

。私はインターネットを調べたが、JSONを投稿する良い例は見つからなかった。どんな助けもありがとうございます。ありがとう。

答えて

4

メソッドに@Consumes("application/json")注釈を追加します。

更新:これは私の作品:

リソース方法:

@POST 
@Produces("application/json") 
@Consumes("application/json") 
public Address post(Address addr) { 
    return addr; 
} 

Addressクラス:

@XmlRootElement 
public class Address { 
    public String city; 
    public String zip; 
} 

これは私が送りますリクエストです:

Accept application/json 
Content-Type application/json; charset=UTF-8 

{"city":"Miami","zip":"33130"} 

これが私です応答として取得:

{"city":"Miami","zip":"33130"} 
+0

それは役に立たなかった。私はAcceptヘッダーを追加しました。 Accept:application/json、text/javascript、*/*; q = 0.01 – RajV

+0

それは変だけど、それは私のために働く。私はそれを実装した方法で私の答えを更新しました。 –

+0

サーバーログを調べて、サーバー側にスタックトレースがあるかどうかを確認します。 –

1

のEclipseLinkモジュールに問題(Eclipseの永続性サービス - 2.3.2.v20111125-r10461)があるように思わWLSのディストリビューションにバンドルさ:として

javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException 
- with linked exception: 
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: An error occurred unmarshalling the document 
Internal Exception: java.util.NoSuchElementException] 
    at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:113) 
    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:699) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:216) 
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:132) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:352) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:235) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3284) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3254) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) 
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2163) 
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089) 
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074) 
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1512) 
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) 
Caused by: javax.xml.bind.UnmarshalException 
- with linked exception: 
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: An error occurred unmarshalling the document 
Internal Exception: java.util.NoSuchElementException] 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.handleXMLMarshalException(JAXBUnmarshaller.java:827) 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:407) 
    at com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalJAXBElementFromJSON(BaseJSONUnmarshaller.java:108) 
    at com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalFromJSON(BaseJSONUnmarshaller.java:97) 
    at com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider.readFrom(JSONRootElementProvider.java:125) 
    at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111) 
    ... 35 more 
Caused by: Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: An error occurred unmarshalling the document 
Internal Exception: java.util.NoSuchElementException 
    at org.eclipse.persistence.exceptions.XMLMarshalException.unmarshalException(XMLMarshalException.java:95) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.convertSAXException(SAXUnmarshaller.java:842) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:830) 
    at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:602) 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:399) 
    ... 39 more 
Caused by: java.util.NoSuchElementException 
    at com.sun.jersey.json.impl.reader.JsonReaderXmlEvent.getAttributeValue(JsonReaderXmlEvent.java:147) 
    at com.sun.jersey.json.impl.reader.JsonXmlStreamReader.getAttributeValue(JsonXmlStreamReader.java:655) 
    at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader$IndexedAttributeList.getValue(XMLStreamReaderReader.java:312) 
    at org.eclipse.persistence.oxm.record.UnmarshalRecord.startElement(UnmarshalRecord.java:648) 
    at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parseEvent(XMLStreamReaderReader.java:108) 
    at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:81) 
    at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:71) 
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:818) 
    ... 41 more 

回避策を使用して、jaxb.propertiesファイルをパッケージに作成して、JAXBクラス(例:アドレス)は、以下の内容が配置されている:

javax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory 

これは代わりのEclipseLinkからの1つのWLS 12cにも存在しているJAXB RI()からJAXBContextクラスのインスタンスを使用するWLSを伝えるべきです。これは単なる回避策であることに注意してください。

+0

これは本当に400 Bad Request(500 Server Errorとは対照的に)を引き起こすか、これは別の問題ですか? EclipseLinkの質問にタグを付けることを提案しました。 – Rup

+0

これは依然として同じ問題です。上記の例外は、Jerseyで400 Bad Requestが発生していることです。 –

+1

実際、JAXBを使用してJSONを読み取るためのXMLイベントを偽造するJersey Json XMLリーダーは、いくつかの問題があります(最後のスタックトレースを参照)。私。この問題は、MOXyではなくJerseyのJsonXmlStreamReaderで発生する可能性があります。 –

関連する問題