2015-05-21 3 views
3

Я провел дни, пытаясь понять это. Все, что я хочу сделать, это создать простой веб-сервис, чтобы возвращать списки POJO как JSON. Почему это так сложно?Как создать простой веб-сервис JSON Jersey 2.x RESTful на Glassfish 4?

Я начинаю с этим в моей POM:

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-web-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet</artifactId> 
    <version>2.17</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.17</version> 
</dependency> 

Вот мой ResourceConfig:

@ApplicationPath("reservations") 
public class ApplicationConfig extends ResourceConfig { 

    public ApplicationConfig() { 
     packages("com.oracle.swr.ws.mavenproject3", 
       "com.fasterxml.jackson.jaxrs.base"); 
    } 
} 

Вот мой сайт:

@Path("/bookedAssets") 
public class GenericResource { 

    @Context 
    private UriInfo context; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<String> getJson() { 

     List<String> strings = new ArrayList<>(); 
     strings.add("test"); 
     strings.add("test2"); 
     return strings; 
    } 
} 

Когда я пытаюсь запустить я получаю:

Суровый: MessageBodyWriter не найден для типа media = application/json, type = class java.util.ArrayList, genericType = class java.util.ArrayList.

Я изменил мой ResourceConfig, чтобы попытаться использовать JacksonFeature:

public ApplicationConfig() { 
    super(GenericResource.class, JacksonFeature.class); 
} 

И я получаю сообщение об ошибке:

Предупреждение: StandardWrapperValve [com.oracle.swr.ws.mavenproject3.ApplicationConfig] : Servlet.service() для сервлета com.oracle.swr.ws.mavenproject3.ApplicationConfig выбрал исключение org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: невозможно разрешить любые компоненты для типов: [org.glassfish.jersey .message.filtering.spi.ObjectProvider]; Привязки: [QualifierInstance {annotationClass = interface javax.enterprise.inject.Default, values ​​= {}, hashCode = 633679645}]

Я пробовал много разных комбинаций вещей в моей POM. Не повезло. Я прочитал документацию в Джерси. Не повезло.

Этот парень говорит, что документация Джерси - это дерьмо, а вместо этого: http://jersey.576304.n2.nabble.com/Beware-of-JacksonFeature-in-Jersey-td7581633.html. Пробовал. Не повезло.

Есть ли у кого-нибудь действительно простой пример получения GF 4.x, Jersey 2.x, Jackson 2.x?

+0

Попробуйте поставить jackson как 'provided' также. Glassfish поставляется с этим модулем. Я думаю, что модуль зависит от других модулей, которые могут быть противоречивыми в версиях. –

+0

@peeskillet Я добавил «предоставил», и это, к сожалению, не изменило ситуацию. – wsaxton

+1

Попробуйте избавиться от 'jersey-json-media-jackson', добавьте [этот] (https://github.com/FasterXML/jackson-jaxrs-providers) и зарегистрируйте пакет' com.fasterxml.jackson .jaxrs.json' и посмотреть, что произойдет –

ответ

2

(Per комментарий от @peeskillet) я заменил это:

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

с:

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.5.3</version> 
</dependency> 

и

packages("com.fasterxml.jackson.jaxrs.base"); 

с:

packages("com.fasterxml.jackson.jaxrs.json"); 
+0

Собственно, это не ответ. Я теперь получаю следующее в журналах из стекловолокна: MessageBodyWriter не найден для типа media = application/json, type = class java.util.ArrayList, genericType = java.util.List . – wsaxton

+0

Что заставляет вас думать, что это должно быть в предоставленном объеме? –

-1

Я бы рекомендовал использовать DropWizard вместо прямого использования Джерси. DropWizard интегрирует вещи (Джерси, Джексон, каротаж и т. Д.), И настройка - легкий ветерок. В качестве альтернативы вы можете рассмотреть Spring Boot, если только использование Джерси не является строгим требованием.

+0

К сожалению, мы ограничены в использовании стороннего программного обеспечения, и у нас уже есть довольно большой стек Java EE, поэтому добавление к нему, вероятно, является не стартером. – wsaxton

+0

Я тебя слышу. Иногда инерция убивает прогресс. Но использование «ванили» Джерси в эти дни, к сожалению, является потерей предложения. Удачи все еще, как только вы выясните, все работает отлично. Это самонастройка, которая обычно грубая. – StaxMan

+0

Сервер приложений также интегрирует их. Если вы не хотите, чтобы эта готовая интеграция, вы все равно можете выбрать свои собственные зависимости. Если вы затем выберите «Джерси», просто проверьте его одностраничный документ, который расскажет вам, что нужно смешивать и сопоставлять (действительно 3 зависимостей от maven, полностью мертвы от мозгов, и в этом случае вам не нужно брать зависимости вашего сервера). То же самое относится и к рестайлингу, например: придерживайтесь своей реализации сервера или принимайте другое. DropWizard/SpringBoot не отличаются, за исключением того, что они не являются стандартными Java EE. – ymajoros

Смежные вопросы