Ответ 1
Я решил это. Все, что мне нужно было сделать, это добавить библиотеку jersey-json-1.6.jar в проект (это не обязательная часть трикотажа).
@XmlRootElement
public class Todo {
private String s = "test";
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
и сервис:
@Path("/test")
public class Service {
@GET
@Produces({MediaType.APPLICATION_JSON })
public List<Todo> getAllGadgets() {
return Arrays.asList(new Todo[] { new Todo() });
}
}
my web.xml:
<servlet>
<servlet-name>Jersey REST Service</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>com.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Вся эта работа, если я установил для MediaType.APPLICATION_XML для Produces аннотацию. Но для JSON я получаю следующее исключение:
SEVERE: Исправлено исключение для ответа: 500 - внутренняя ошибка сервера) javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A автор сообщения для Java-класса java.util.Arrays $ArrayList и Java type java.util.List, и приложение типа MIME media/json не найден
Я использую Jersey 1.6 и, согласно учебнику, формат JSON должен работать с JAXB без какого-либо дополнительного программирования. Что не так?
Я решил это. Все, что мне нужно было сделать, это добавить библиотеку jersey-json-1.6.jar в проект (это не обязательная часть трикотажа).
Добавьте следующий параметр в серверт Джерси в файле web.xml, это требуется для последних версий хард-сервлета 1.x.
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Другие ответы не сработали для меня, но я, наконец, получил его для работы с JSON.
Я использовал jersey-bundle-1.17.jar(также пытался с asm-3.1.jar и jersey-json-1.17.jar добавлен в classpath и все еще не работал). Я, наконец, попробовал загрузить zip, который включает 12 различных банок. Как только я добавил все 12 банок в мой путь к классу, я, наконец, избавился от ошибки и отлично работает с JSON.
Надеюсь, это поможет кому-то.
Update: Вот ссылка на zip файл, содержащий 12 файлов jar: jersey-archive-1.17.zip
Другое обновление для пользователей Maven: Добавьте следующее в свой pom.xml, чтобы получить 12 банок в отдельности:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.1</version>
</dependency>
Я использую Google App Engine и много борется с этим, если вы используете jersey-bundle-1.17.jar большую часть работы, пока не добавите
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
вы получите много странных сообщений. Это потому, что вы пропустите несколько банок Джексона. Если вы перейдете на домашнюю страницу Джерси и загрузите zip и комплект. Просто отбросьте пакет и от zip вам нужно добавить 4 Jackson jars в ваш путь к классу, и вы должны получить все, что работает без ошибок.
Добавление jackson-jaxrs-1.9.2.jar разрешает эту ошибку ниже
SEVERE: The registered message body writers compatible with the MIME media type are:
application/json ->
Добавление jackson-xc-1.9.2.jar разрешает эту атаку ниже
java.lang.NoClassDefFoundError: орг/Codehaus/джексон/хс/JaxbAnnotationIntrospector
Надеюсь, это поможет кому-то.
Исключительное сообщение об авторе сообщения, указанное в OP, будет поднято, если вы не аннотируете POJO (или базовый POJO) с помощью @XmlRootElement
.
Например:
@XmlRootElement
public class BaseBean
{
private Boolean success = Boolean.TRUE;
private String message;
/**
* Empty constructor to satisfy requirements of JAXRS.
*/
public BaseBean() {}
/**
* Returns a simple message to accompany the success/failure.
* @return
*/
public String getMessage()
{
return message;
}
/**
* Sets the message (if required).
* @param message
*/
public void setMessage(String message)
{
this.message = message;
}
/**
* Returns a flag indicating whether a request for content was
* successful.
* @return
*/
public Boolean getSuccess()
{
return success;
}
/**
* Marks the success of a request for content.
* @param success
*/
public void setSuccess(Boolean success)
{
this.success = success;
}
}
Ответ Kamran работал у меня, просто для того, чтобы больше расширять XML:
<servlet>
<servlet-name>JerseyServletContainer</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>