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
하시면 됩니다.@XmlRootElement
JAXB j j j j j j ( JAXB ) 。
단, 순수 POJO 매핑을 원하는 경우 다음 작업을 수행해야 합니다(유감스럽게도 문서에는 기재되어 있지 않습니다).
- 클래스 패스에 jackson*.jar를 추가합니다(@Vitali Bichov에서 설명).
- 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
이름 안에 . 에는 '하다'가 되어 있습니다.@XmlRootElement
POJO입니다.
@XmlRootElement
public class Person {
private String firstName;
//getters and setters, etc.
}
그런 다음 동일한 패키지에 ObjectFactory를 만듭니다.
@XmlRegistry
public class ObjectFactory {
public Person createNewPerson() {
return new Person();
}
}
★@Provider
Jersey는 자원 내에서 당신을 위한 마샬링을 용이하게 합니다.
@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-json
pom.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
'programing' 카테고리의 다른 글
jQuery Ajax가 404 오류를 반환하지만 올바른 응답입니다. (0) | 2023.03.02 |
---|---|
XML 없이 스프링이 있는 속성을 기반으로 런타임에 다른 서비스를 주입하는 방법 (0) | 2023.03.02 |
Windows 서비스로 MongoDB를 실행하려면 어떻게 해야 하나요? (0) | 2023.03.02 |
Word후크/필터를 눌러 게시물 내부의 링크를 처리합니다. (0) | 2023.03.02 |
잭슨:Json 구성 값 무시 (0) | 2023.03.02 |