2012-03-15 39 views
5

Tôi có thể đăng thành công dữ liệu XML vào dịch vụ của mình, nhưng, cố gắng làm tương tự bằng cách sử dụng JSON không thành công. POJO là:Cách gửi yêu cầu JSON tới dịch vụ REST của Jersey?

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

Nguồn dịch vụ là:

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

Tôi đang làm một POST như sau:

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

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

Các máy chủ đang phản hồi bằng 400 Bad Request. Tôi đã lùng sục Internet nhưng không tìm thấy ví dụ hay về việc đăng JSON. Bất kỳ trợ giúp được đánh giá cao. Cảm ơn.

Trả lời

4

Thêm chú thích @Consumes("application/json") vào phương thức fix() của bạn.

Cập nhật: Đây làm việc cho tôi: Phương pháp

Resource:

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

Địa chỉ lớp:

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

Đây là yêu cầu Tôi gửi:

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

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

Đây là những gì tôi có được như một phản ứng:

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

Điều đó không hữu ích. Tôi thậm chí còn thêm tiêu đề Chấp nhận: Chấp nhận: application/json, text/javascript, */*; q = 0,01 – RajV

+0

Điều đó thật kỳ lạ, nó có hiệu quả đối với tôi. Tôi đã cập nhật câu trả lời của mình với cách tôi đã triển khai nó. –

+0

Kiểm tra nhật ký máy chủ để xem có dấu vết ngăn xếp nào ở phía máy chủ hay không. –

1

Dường như có một vấn đề với các mô-đun EclipseLink (Eclipse Persistence Dịch vụ - 2.3.2.v20111125-r10461) kèm trong việc phân phối 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 

Là một workaround bạn có thể tạo một tập tin jaxb.properties trong gói mà các lớp JAXB của bạn (ví dụ Địa chỉ) được đặt với các nội dung sau:

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

này nên nói với WLS sử dụng một thể hiện của lớp JAXBContext từ JAXB RI (mà cũng có mặt trong WLS 12c) thay vì một từ EclipseLink. Hãy ghi nhớ đây chỉ là một cách giải quyết.

+0

Điều đó thực sự sẽ gây ra một yêu cầu 400 Bad (trái ngược với một lỗi máy chủ 500) hay đây là một vấn đề khác? Tôi thấy bạn đã đề xuất gắn thẻ câu hỏi EclipseLink. – Rup

+0

Đây vẫn là vấn đề tương tự - ngoại lệ trên gây ra 400 Yêu cầu không hợp lệ ở Jersey. –

+1

Thực ra, có vẻ như trình đọc xml Jersey Json giả mạo các sự kiện XML để đọc JSON sử dụng JAXB có một số vấn đề (xem dấu vết ngăn xếp cuối cùng). I E. vấn đề có thể là với JsonXmlStreamReader của Jersey chứ không phải là MOXy. –

Các vấn đề liên quan