programing

Jersey JSON POJO 지원 사용방법

batch 2023. 3. 2. 22:06
반응형

Jersey JSON POJO 지원 사용방법

JSON에서 RESTful 리소스로 서비스하고 싶은 오브젝트가 있습니다.Jersey의 JSON POJO 지원을 다음과 같이 설정했습니다(web.xml).

<servlet>  
    <servlet-name>Jersey Web Application</servlet-name>  
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

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

그러나 리소스에 액세스하려고 하면 다음과 같은 예외가 발생합니다.

SEVERE: A message body writer for Java type, class com.example.MyDto, and MIME media type, application/json, was not found
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException
...

제가 서비스하려는 수업은 복잡하지 않습니다. 단지 몇 개의 최종 공개 분야와 모든 분야를 설정하는 건설업자만 있을 뿐입니다.필드는 모두 문자열, 프리미티브, 이와 유사한 클래스 또는 해당 목록입니다(일반 목록 대신 일반 목록을 사용해보았습니다).T>s, 무효).뭐가 주는 건지 아는 사람?감사합니다!

자바 EE 6

저지 1.1.5

글라스피시 3.0.1

하시면 됩니다.@XmlRootElementJAXB j j j j j j ( JAXB ) 。

단, 순수 POJO 매핑을 원하는 경우 다음 작업을 수행해야 합니다(유감스럽게도 문서에는 기재되어 있지 않습니다).

  1. 클래스 패스에 jackson*.jar를 추가합니다(@Vitali Bichov에서 설명).
  2. web.xml을 사용하는 com.sun.jersey.config.property.packages 파라미터, add init " " " , "org.codehaus.jackson.jaxrs목록으로 이동합니다.JSON Jersey.

이것으로 충분했습니다 - Jersey 2.3.1

web.xml 파일:

<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value><my webapp packages>;org.codehaus.jackson.jaxrs</param-value>
</init-param>
</servlet>

pom.xml 파일:

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.3.1</version>
</dependency>

Jersey-json에는 JAXB가 실장되어 있습니다.이 예외가 발생하는 이유는 프로바이더가 등록되어 있지 않기 때문입니다.구체적으로는 MessageBodyWriter가 없습니다.프로바이더내에 적절한 콘텍스트를 등록할 필요가 있습니다.

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final static String ENTITY_PACKAGE = "package.goes.here";
    private final static JAXBContext context;
    static {
        try {
            context = new JAXBContextAdapter(new JSONJAXBContext(JSONConfiguration.mapped().rootUnwrapping(false).build(), ENTITY_PACKAGE));
        } catch (final JAXBException ex) {
            throw new IllegalStateException("Could not resolve JAXBContext.", ex);
        }
    }

    public JAXBContext getContext(final Class<?> type) {
        try {
            if (type.getPackage().getName().contains(ENTITY_PACKAGE)) {
                return context;
            }
        } catch (final Exception ex) {
            // trap, just return null
        }
        return null;
    }

    public static final class JAXBContextAdapter extends JAXBContext {
        private final JAXBContext context;

        public JAXBContextAdapter(final JAXBContext context) {
            this.context = context;
        }

        @Override
        public Marshaller createMarshaller() {
            Marshaller marshaller = null;
            try {
                marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            } catch (final PropertyException pe) {
                return marshaller;
            } catch (final JAXBException jbe) {
                return null;
            }
            return marshaller;
        }

        @Override
        public Unmarshaller createUnmarshaller() throws JAXBException {
            final Unmarshaller unmarshaller = context.createUnmarshaller();
            unmarshaller.setEventHandler(new DefaultValidationEventHandler());
            return unmarshaller;
        }

        @Override
        public Validator createValidator() throws JAXBException {
            return context.createValidator();
        }
    }
}

은 「」를 합니다.@XmlRegistry이름 안에 . 에는 '하다'가 되어 있습니다.@XmlRootElementPOJO입니다.

@XmlRootElement
public class Person {

    private String firstName;

    //getters and setters, etc.
}

그런 다음 동일한 패키지에 ObjectFactory를 만듭니다.

@XmlRegistry
public class ObjectFactory {
   public Person createNewPerson() {
      return new Person();
   }
}

@ProviderJersey는 자원 내에서 당신을 위한 마샬링을 용이하게 합니다.

@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response doWork(Person person) {
   // do work
   return Response.ok().build();
}

Jersey와 Jackson POJOs(JAXB가 아닌)의 사용법을 나타내는 지시에 따라 보았습니다.Jersey 1.12에서도 작동했습니다.

최종 필드를 사용하는 이유는 무엇입니까?jersey를 사용하고 있는데 JAXB 오브젝트/pojos가 몇 개 있는데, 자원 메서드에 @Products("application/json")를 주석을 달기만 하면 바로 사용할 수 있습니다.web.xml을 조작할 필요가 없었습니다.당신의 포에 주석이 올바르게 붙어 있는지 확인하세요.

여기 심플한 포조가 있습니다.

package test;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class SampleJaxbObject {

    private String field1;

    private Integer field2;

    private String field3;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public Integer getField2() {
        return field2;
    }

    public void setField2(Integer field2) {
        this.field2 = field2;
    }

    public String getField3() {
        return field3;
    }

    public void setField3(String field3) {
        this.field3 = field3;
    }


}

당신은 아마 이것을 이미 알아냈을 것입니다만, 당신이 해야 할 일은 이 잭슨 항아리들을 당신의 클래스 패스에 추가하는 것입니다: 잭슨-코어, 잭슨-잭스-잭스-매퍼, 그리고 잭슨-xc.

다른 사람들이 지적했듯이 다른 방법이 있는 것 같다.이것을 「com」에 추가합니다.sun.cod.config.config.config.config.config.conf.conf.conf.conf.conf.conf.confirm.jaxrs" 파라미터(tomcat 및 web.xml을 사용하는 경우): 다음과 같이 입력합니다.

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

이 작업을 수행하려면 클래스 경로에 동일한 잭슨 항아리도 필요합니다.

Jersey 2.0은 MOXy와 Jackson을 사용하여 JSON을 지원합니다.

클래스 패스에 JAR이 존재하고 기능을 사용하여 잭슨 지원을 활성화할 수 있는 경우 MOXy 지원은 기본적으로 이니블입니다.자세한 내용은 JSON 바인딩에 관한 Jersey 2.0 User Guide 장을 참조하십시오.

https://jersey.java.net/documentation/latest/media.html#json

구성 없이 MOXy 지원을 추가하려면 다음 종속성을 추가합니다.pom.xml

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.6</version>
</dependency>

처음이지만 클래스 패스에 jackson-all-1.9.0.jar를 추가한 후 POJOs를 사용할 수 있었습니다.

다음은 나에게 효과가 있었다.Jackson과 Tomcat6에서 실행되는 Apache Felix(OSGi)에서 Jersey 2.7을 사용하고 있습니다.

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        super(JacksonFeature.class);
        // point to packages containing your resources
        packages(getClass().getPackage().getName());
    }
}

그리고 나서, 당신의web.xml(혹은 제 경우엔,Hashtable) 。javax.ws.rs.Application그렇게

<init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value><MyApplication.class.getName()></param-value>
</init-param>

지정할 필요가 없습니다.com.sun.jersey.config.property.pacakges또는com.sun.jersey.api.json.POJOMappingFeature

다음 항목에 대한 종속성을 지정하기만 하면,

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.7</version>
</dependency>

이동jersey-jsonpom.xml 맨 위에 의존하여 이 문제를 해결했습니다.

<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
  </dependency>

  <!-- other dependencies -->

</dependencies>

이것은 Jersey 2.30에서 유효했습니다.

pom.xml:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.30</version>
</dependency>

WEB-INF/web.xml:

<servlet>
  <servlet-name>My Jersey REST Service</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <load-on-startup>1</load-on-startup>
  <!-- ATTENTION: Use Jackson for JSON: -->
  <init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
  </init-param>
  <!-- ... -->
  <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.example.myapp</param-value>
  </init-param>
</servlet>

언급URL : https://stackoverflow.com/questions/5161466/how-do-i-use-the-jersey-json-pojo-support

반응형