2013-07-04 1 views
1

저지와 Moxy가있는 Tomcat 7을 사용하고 있습니다. maven을 사용하여 jersey.server.jar, jersey.servlet.jar, jersey-core.jar, moxy (org.eclipse.persistence.moxy, 버전 2.5.0)를 추가했습니다.Jersey와 Moxy를 사용하는 JAXB

나는 인터페이스 (: org.kkm.test.model 패키지 이름) :이

public interface Model extends BaseModel { 
    public String getConsumerId(); 
    public void setConsumerId(String consumerId); 
} 

@XmlRootElement(name="reading") 
@XmlType(propOrder={"consumerId", "address", "reading", "readingDate", "rotation", "readingStatus"}) 
public interface Reading extends Model { 
    @XmlElement 
    public Address getAddress(); 
    @XmlElement 
    public double getReading(); 
    @XmlElement 
    public Date getReadingDate(); 
    @XmlElement 
    public short getRotation(); 
    @XmlElement 
    public ReadingStatus getReadingStatus(); 

    public void setAddress(Address address); 
    public void setReading(double reading); 
    public void setReadingDate(Date readingDate); 
    public void setRotation(short rotation); 
    public void setReadingStatus(ReadingStatus readingStatus); 
} 


public interface Address { 
    public String getAddress1(); 
    public String getAddress2(); 
    public String getAddress3(); 
    public String getAddress4(); 

    public void setAddress1(String address1); 
    public void setAddress2(String address2); 
    public void setAddress3(String address3); 
    public void setAddress4(String address4); 
} 

내가 구현의 ReadingImpl 및 AddressImpl (패키지 이름 : org.kkm.test.model.impl)가 있습니다. 나는 다음과 같은 내용으로 org.kkm.test.model에 jaxb.properties 파일을 배치 한

@Path("/sample") 
public class TestService { 
    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    @Path("/readings") 
    public List<Reading> getReadings() { 
     Reading reading1 = DependencySupplier.getReading(); 
     Address address = DependencySupplier.getAddress(); 
     address.setAddress1("Moolekkadavil"); 
     address.setAddress2("Kottuvallikad"); 
     address.setAddress3("Moothakunnam.P.O"); 
     address.setAddress4("683516"); 
     reading1.setAddress(address); 
     reading1.setConsumerId("1234567890"); 
     reading1.setReading(11.00); 
     reading1.setReadingDate(new Date()); 
     reading1.setReadingStatus(ReadingStatus.BILLED); 
     reading1.setRotation((short) 1); 
     Reading reading2 = DependencySupplier.getReading(); 
     reading2.setAddress(address); 
     reading2.setConsumerId("1234567890"); 
     reading2.setReading(11.00); 
     reading2.setReadingDate(new Date()); 
     reading2.setReadingStatus(ReadingStatus.BILLED); 
     reading2.setRotation((short) 1); 
     List<Reading> list = new ArrayList<Reading>(); 
     list.add(reading1); 
     list.add(reading2); 
     return list; 
    } 
    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    @Path("/reading") 
    public Reading getReading() { 
     Reading reading1 = DependencySupplier.getReading(); 
     Address address = DependencySupplier.getAddress(); 
     address.setAddress1("Moolekkadavil"); 
     address.setAddress2("Kottuvallikad"); 
     address.setAddress3("Moothakunnam.P.O"); 
     address.setAddress4("683516"); 
     reading1.setAddress(address); 
     reading1.setConsumerId("1234567890"); 
     reading1.setReading(11.00); 
     reading1.setReadingDate(new Date()); 
     reading1.setReadingStatus(ReadingStatus.BILLED); 
     reading1.setRotation((short) 1); 
     return reading1; 
    } 
} 

그 MOXY이 사용할 수 있도록 : 다음과 같이 I는 서비스 클래스가

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

내 web.xml 파일은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>Test JAX</display-name> 
    <servlet> 
    <servlet-name>testjax</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>org.kwa.test.service</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>testjax</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

내가 직면하고 문제는 다음과 같습니다 나는 "/ 휴식/샘플/독서"나는 XML의 올바른 표현은 무엇입니까,하지만 난 호출하고 때 "를 호출하고시/휴식/샘플/독서 "I 받고있다

com.sun.jersey.api.MessageException : Java 용 메시지 본문 작성자 클래스 ... 등등 오류가 발생했습니다.

public class MyMessageBodyWriter implements MessageBodyWriter { 

    private List<Class<?>> types; 

    public MyMessageBodyWriter() { 
     types = new ArrayList<Class<?>>(); 
     types.add(ReadingImpl.class); 
    } 

    public long getSize(Object obj, Class type, Type genericType, Annotation[] annotations, 
      MediaType mediaType) { 
     // TODO Auto-generated method stub 
     return -1; 
    } 

    public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, 
      MediaType mediaType) { 
     return this.types.contains(type); 
    } 

    public void writeTo(Object target, Class type, Type genericType, Annotation[] annotations, 
      MediaType mediaType, MultivaluedMap headers, OutputStream outputStream) 
      throws IOException, WebApplicationException { 
     try { 
      JAXBContext ctx = JAXBContext.newInstance(type); 
      Marshaller marshaller = ctx.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      marshaller.marshal(target, outputStream); 
     } catch (JAXBException e) { 
      throw new RuntimeException(e); 
     }  
    } 
} 

을 이제 "/ 휴식/샘플/읽기"나는 다음과 같은 XML 얻고 호출 할 때 : 당신이 할 수

<?xml version="1.0" encoding="UTF-8"?> 
<address> 
    <address1>Moolekkadavil</address1> 
    <address2>Kottuvallikad</address2> 
    <address3>Moothakunnam.P.O</address3> 
    <address4>683516</address4> 
</address><consumerId>1234567890</consumerId><reading>11.0</reading><readingDate>2013-07-04T21:16:39.128</readingDate><readingStatus>BILLED</readingStatus><rotation>1</rotation> 

을 다음과 같이

그때 나는 MessageBodyWriter를 썼다 루트 요소가없는 것을보십시오. 따라서 "주소"요소가 "추가 콘텐츠"로 간주되어 오류로 표시되면 "주소"를 루트 요소 및 콘텐츠로 사용합니다.

답변

1

마지막으로 대답을 찾았습니다. 매우 간단했습니다. 내가 그걸 어떻게 일찍 생각할 수 없었어? 이것이 성능에 영향을 줄지 확실하지 않습니다. MessageBodyWriter 또는 기타 항목이 필요하지 않습니다. 그냥 복사 org.kkm.test.model에서 jaxb.properties 파일을 (이동되지 않음) 구현 패키지에 배치 (즉, org.kkm.test.model.impl에서)와 를 추가 @ 구현에 XmlRootElement (name = "reading")도 있습니다 (예 : ReadingImpl). 주문을 원하시면 @XmlType (propOrder ....