Как создать вывод JSON с помощью Jersey 1.6 с использованием JAXB - PullRequest
27 голосов
/ 17 мая 2011
@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-типа java.util.List, а MIME-тип приложения / json не найден

Я использую Jersey 1.6 и, согласноучебник в формате JSON должен работать с JAXB без какого-либо дополнительного программирования.В чем дело?

Ответы [ 6 ]

32 голосов
/ 17 мая 2011

Я решил это. Все, что мне нужно было сделать, это добавить в проект библиотеку jersey-json-1.6.jar (это не обязательная часть jersey)

14 голосов
/ 13 августа 2012

Добавьте следующий параметр к сервлету jersey в файле web.xml, это требуется для последних версий 1.x сервлета jersey.

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
6 голосов
/ 10 мая 2013

Я использую 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>

вы получите много странных сообщений. Это потому что ты скучаешь по банкам Джексона. Если вы перейдете на домашнюю страницу jersey и загрузите почтовый индекс и комплект. Просто выкиньте пакет и из почтового индекса вам нужно добавить 4 баночки Джексона в ваш путь к классу, и вы получите все работающее без ошибок.

Добавление 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

Надеюсь, это кому-нибудь поможет.

6 голосов
/ 27 марта 2013

Другие ответы у меня не сработали, но я наконец-то получил его для работы с JSON.

Я использовал jersey-bundle-1.17.jar (также пробовал с добавлением asm-3.1.jar и jersey-json-1.17.jar в classpath, но все еще не работал).Я наконец попытался загрузить почтовый индекс, который включает 12 различных фляг.Как только я добавил все 12 банок в путь к классам, я наконец-то избавился от ошибки и прекрасно работает, возвращая JSON.

Надеюсь, это кому-нибудь поможет.ссылка на 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>
0 голосов
/ 15 декабря 2015

Ответ Камрана работал для меня, просто чтобы больше узнать о 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>
0 голосов
/ 19 мая 2015

Исключение составителя тела сообщения, указанное 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;
    }
}
...