2013-11-04 4 views
1

Jersey를 사용하여 매우 간단한 RESTful 웹 서비스를 만들려고합니다. JAXB를 사용하여 JSON을 소비하고 생성하도록 노력하고 있습니다. 문제는 JSON을 전달할 때 오류가 발생한다는 것입니다.JAXB를 사용하여 Jersey에서 JSON 구문 분석

아래는 리소스 코드입니다. status()와 echo() 모두 제대로 작동합니다. processRequest()에서 현재 텍스트 응답을 생성 중이지만 나중에 JSON을 생성하기 위해 변경 될 것입니다.

package web_service; 

import javax.ws.rs.*; 
import javax.ws.rs.core.*; 

@Path("/") 
public class WebService { 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String status() { 
     return "Web service is up and running."; 
    } 

    @POST 
    @Consumes(MediaType.TEXT_PLAIN) 
    @Produces(MediaType.TEXT_PLAIN) 
    public String echo(String consumed) { 
     return consumed; 
    } 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.TEXT_PLAIN) 
    public String processRequest(JAXBElement<Request> r) { 
     Request request = r.getValue(); 
     return "Latitude: " + request.latitude + 
      "\n:Longitude: " + request.longitude; 
    } 
} 

는 요청 모델 :

package web_service; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Request { 

    public String latitude; 
    public String longitude; 

    public Request() {} 

    public Request(String latitude, String longitude) { 
     this.latitude = latitude; 
     this.longitude = longitude; 
    } 

    // Getters and setters for both 
} 

내 web.xml의 :

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5"> 

    <servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 

     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>web_service</param-value> 
     </init-param> 

     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

마지막으로,이 내가 (헤더로 설정하고있어 POST의 예입니다 'Content-Type : application/json'); 나는이 프로그램을 실행할 때

{ 
    "latitude":"25.764084501106787", 
    "longitude":"-80.37422332275389" 
} 

, Tomcat은 나에게 다음과 같은 예외가 있습니다 :

WARNING: WebApplicationException cause: 
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=class web_service.Request, genericType=class  web_service.Request. 

을 그리고 나는 다음과 같은 응답을 얻을 :

415 Unsupported Media Type 

Content-Length: 1 kB 
Content-Type: text/html;charset=utf-8 
Date:   2013 Nov 4 17:41:20 
Server:   Apache-Coyote/1.1 

enter image description here

나는 아주 새로운 해요을 이것에 많은 의미가 없습니다. 다행히도, 여러분 중 한 분이 나를 도와 줄 수있을 것입니다. 감사!

답변

1

엔드 포인트에서 이것을 시도 :

Coordinates 당신이 게시 된 JSON 컨텐츠를 미러링하는 간단한 POJO가
@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.TEXT_PLAIN) 
public String processRequest(Coordinates coordinates) { 
    return "Latitude: " + coordinates.getLatitude() + 
     "\n:Longitude: " + coordinates.getLongitude(); 
} 

.

그런 다음이 구성을 프로젝트에 모든 라이브러리를 추가하고 추가하여 JAXB 지원이 잭슨, 사용

<init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value> 
</init-param> 

을 "저지 REST 서비스"서블릿.

+0

나는 똑같은 오류가있어 도움이 될 것입니다. – fpele

+0

내가 제공 한 구성으로 시도하십시오. – Vidya

+1

Nope. 모든 잭슨 병을 web.xml에 추가하고 Request를 POJO로 바꿨습니다. 계속해서 동일한 오류가 발생합니다. '미디어 유형 = application/json, type = class web_service.Request, genericType = class web_service.Request.' 및'HTTP 상태 415 - 지원되지 않는 미디어 유형 '에 대해 MessageBodyReader를 찾을 수 없습니다. – fpele

0

이 오류는 지정된 헤더없이 요청할 때 발생합니다. 서비스에서 @Consumes (MediaType.APPLICATION_JSON) @Produces (MediaType.TEXT_PLAIN)

요청 헤더 "콘텐츠 유형"을 얻을 수 있는지 확인? application/json 및 헤더 "accept"에 text/html이 포함되어 있습니다.

0

요청 모델 클래스에 문제가 있다고 생각합니다. 모델 클래스가 @XmlaccessType을 지정하지 않으므로 기본적으로 PUBLIC_MEMBER로 간주됩니다. 인스턴스 변수가 getter 및 setter와 함께 public이기 때문에 JAXB는 적절한 바인딩을 알아낼 수 없습니다. 따라서 예외가 발생합니다. 따라서 문제에 대한 두 가지 수정 사항이 있습니다.

1) 인스턴스 변수를 비공개로 설정할 수 있습니다. 2) 또는 모델 클래스에 대해 @XmlaccessType을 명시 적으로 지정할 수 있으며 마찬가지로 충돌이없는 주석을 제공 할 수 있습니다.

1

JAXB (자바 아키텍처 XML 바인딩) XML 바인딩을 위해 자바 avaialable하지 JSON 문서라도 당신은 을 변환하려고 JavaScript 대상 표기xml 바인더이 상황에서는 불가능합니다. 그리고 나는 당신이 "BodyWriter 클래스"JAX-RS 패키지에서 생성 된 오류를 가져와야합니다.

어쨌든 리소스를 사용하여 JSON을 생성하고 소비하려는 경우 " 이 변환을 전달하기위한 프로젝트 라이브러리에 "JAR 사용할 수 MOXY :

희망은 내가 여기에 쓰고 어떤 다른 프로그래머