2015-05-19 51 views
0

我想建立一個CXF RESTFul服務與JSON作爲輸入和輸出。我正在使用JAXRSServerFactoryBean來啓動我的服務。當我嘗試從客戶端程序中訪問URL時,出現以下異常。我的程序非常簡單,並且在底部附加了相同的內容。無法通過CXF與JSON

請幫忙。

May 19, 2015 11:03:30 PM org.apache.cxf.jaxrs.provider.AbstractJAXBProvider handleExceptionStart 
    WARNING: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[0,0] 
    Message: A JSONObject text must begin with '{' at character 0 of 
     at org.codehaus.jettison.mapped.MappedXMLInputFactory.createXMLStreamReader(MappedXMLInputFactory.java:51) 
     at org.codehaus.jettison.AbstractXMLInputFactory.createXMLStreamReader(AbstractXMLInputFactory.java:116) 
     at org.apache.cxf.jaxrs.provider.json.utils.JSONUtils.createStreamReader(JSONUtils.java:162) 
     at org.apache.cxf.jaxrs.provider.json.JSONProvider.createReader(JSONProvider.java:290) 
     at org.apache.cxf.jaxrs.provider.json.JSONProvider.createReader(JSONProvider.java:280) 
     at org.apache.cxf.jaxrs.provider.json.JSONProvider.readFrom(JSONProvider.java:233) 
     at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1337) 
     at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1288) 
     at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:824) 
     at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:787) 
     at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212) 
     at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77) 
     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 

    May 19, 2015 11:03:30 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse 
WARNING: javax.ws.rs.BadRequestException: HTTP 400 Bad Request 
    at org.apache.cxf.jaxrs.utils.SpecExceptions.toBadRequestException(SpecExceptions.java:84) 
    at org.apache.cxf.jaxrs.utils.ExceptionUtils.toBadRequestException(ExceptionUtils.java:114) 
    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleExceptionEnd(AbstractJAXBProvider.java:705) 
    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleXMLStreamException(AbstractJAXBProvider.java:734) 
    at org.apache.cxf.jaxrs.provider.json.JSONProvider.readFrom(JSONProvider.java:261) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1337) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1288) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:824) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:787) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:234) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1129) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1065) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 

Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[0,0] 
Message: A JSONObject text must begin with '{' at character 0 of 
    at org.codehaus.jettison.mapped.MappedXMLInputFactory.createXMLStreamReader(MappedXMLInputFactory.java:51) 
    at org.codehaus.jettison.AbstractXMLInputFactory.createXMLStreamReader(AbstractXMLInputFactory.java:116) 
    at org.apache.cxf.jaxrs.provider.json.utils.JSONUtils.createStreamReader(JSONUtils.java:162) 
    at org.apache.cxf.jaxrs.provider.json.JSONProvider.createReader(JSONProvider.java:290) 

RestFulServiceStarter

public class RestFulServiceStarter { 
    public static void main(String[] args) { 
     JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); 
     sf.setResourceClasses(ProfileService.class); 
     sf.setResourceProvider(ProfileService.class, 
       new SingletonResourceProvider(new ProfileServiceImpl())); 
     sf.setAddress("http://localhost:9999/"); 
      Server server = sf.create(); 
    } 
} 

ProfileService

@Path("/profile/") 
public interface ProfileService { 

    @GET 
    @Path("/static/") 
    @Consumes({ MediaType.APPLICATION_JSON }) 
    @Produces({ MediaType.APPLICATION_JSON }) 
    public Response getStaticProfiles(ProfileRequest pr); 

} 

ProfileServiceImpl

public class ProfileServiceImpl implements ProfileService { 
    public Response getStaticProfiles(ProfileRequest pr) { 
     return Response.status(200).entity(pr).build(); 
    } 
} 

ProfileRequest

@XmlRootElement (name = "profile") 
public class ProfileRequest { 

    private String name=""; 

    private String country=""; 

    private String region=""; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getCountry() { 
     return country; 
    } 
    public void setCountry(String country) { 
     this.country = country; 
    } 

    public String getRegion() { 
     return region; 
    } 
    public void setRegion(String region) { 
     this.region = region; 
    } 

} 

回答

0

你的接口方法的註解用@GET方法,但它也有一個實體的參數(ProfileRequest)。嘗試@POST。