Статьи

Генерация JSON-схемы в Джерси

Итак, в моем предыдущем посте я говорил о предложении разрешить использование JSON-Schema в WADL, в этом посте рассказывается о том, как заставить это работать с недавней сборкой Jersey. Вам нужно будет скачать / ссылаться на 1.16SNAPSHOT, пока не выйдет 1.16.

Если вы используете Maven, это должно быть довольно просто для обновления ваших зависимостей, если у вас уже есть jersey и jersey-json. Вам просто нужно добавить зависимость от артефакта ‘jersey-wadl-json-schema’ из группы ‘com.sun.jersey.contribs’, чтобы получить новую функцию.

Если вы находитесь за пределами Maven, проще всего загрузить последнюю версию архива jersey-jar, а затем jar-jad-json-schema . Способ их развертывания зависит от конкретного инструмента, но если вы используете WLS, вот несколько конкретных замечаний о том, как обновить версию Jersey.

Как только у вас это заработает, вам нужно создать класс WadlGeneratorConfig, чтобы включить это новое поколение грамматики:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package jersey;
 
import com.sun.jersey.api.wadl.config.WadlGeneratorConfig;
import com.sun.jersey.api.wadl.config.WadlGeneratorDescription;
import com.sun.jersey.wadl.generators.json.WadlGeneratorJSONGrammarGenerator;
 
import java.util.List;
 
public class JsonGeneratorConfig extends WadlGeneratorConfig {
 
    @Override
    public List
 
               configure() {
        return generator(WadlGeneratorJSONGrammarGenerator.class).descriptions();
    }
}

Это может быть зарегистрировано различными способами, вот пример использования параметра init сервлета. Также обратите внимание, что для упрощения этого примера мы используем отображение POJO Джерси; но во время написания этого блога я заметил, что этот параметр влияет на формат JSON-версии WADL, если вы попробуете это.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
         version='3.0'>
  <servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.WadlGeneratorConfig</param-name>
      <param-value>jersey.JsonGeneratorConfig</param-value>
    </init-param>
    <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>
  <servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/resources/*</url-pattern>
  </servlet-mapping>
</web-app>

Поэтому я собрал действительно простой эхо-сервис, просто чтобы убедиться, что все это работает:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package jersey;
 
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
 
@Path('/echo')
public class EchoResource {
 
    @GET
    @Produces('application/json')
    public EchoBean echo() {
        EchoBean bean = new EchoBean();
        bean.setMessage('Hello');
        return bean;
    }
 
    @POST
    @Consumes('application/json')
    @Produces('application/json')
    public EchoBean echo(EchoBean echo) {
        return echo;
    }
 
}
 
and
 
package jersey;
 
public class EchoBean {
    public EchoBean() {
        super();
    }
 
    private String message;
 
    public void setMessage(String message) {
        this.message = message;
    }
 
    public String getMessage() {
        return message;
    }
 
}

Этот очень простой пример приводит к следующему WADL со ссылками на элементы JSON-Schema:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:application xmlns:ns0='http://wadl.dev.java.net/2009/02'>
   <ns0:doc xmlns:ns1='http://jersey.java.net/' ns1:generatedBy='Jersey: 1.16-SNAPSHOT 11/19/2012 12:59 AM'/>
   <ns0:grammars/>
   <ns0:resources base='http://localhost:7103/Jersey/resources/'>
      <ns0:resource path='/echo'>
         <ns0:method id='echo' name='GET'>
            <ns0:response>
               <ns0:representation mediaType='application/json' xmlns:ns2='http://wadl.dev.java.net/2009/02/json-schema' ns2:describedby='application.wadl/echoBean'/>
            </ns0:response>
         </ns0:method>
         <ns0:method id='echo' name='POST'>
            <ns0:request>
               <ns0:representation mediaType='application/json' xmlns:ns3='http://wadl.dev.java.net/2009/02/json-schema' ns3:describedby='application.wadl/echoBean'/>
            </ns0:request>
            <ns0:response>
               <ns0:representation mediaType='application/json' xmlns:ns4='http://wadl.dev.java.net/2009/02/json-schema' ns4:describedby='application.wadl/echoBean'/>
            </ns0:response>
         </ns0:method>
      </ns0:resource>
   </ns0:resources>
</ns0:application>

URI application.wadl / echoBean содержит это простое определение JSON-схемы:

1
2
3
4
5
6
7
8
9
{
    'type' : 'object',
    'properties' : {
        'message' : {
            'type' : 'string'
        }
    },
    'name' : 'echoBean'
}

Теперь в текущем проекте есть ряд ограничений, не в последнюю очередь то, что сгенерированная схема не учитывает никаких настроек записи . Но я подумал, что этого будет достаточно, чтобы спровоцировать обратную связь о том, будет ли эта функция полезна вообще. По-видимому, растет интерес к JSON-Schema как в сети, так и внутри Oracle, поэтому было бы интересно посмотреть, станет ли это описание более распространенным.

Ссылка: создание JSON-схемы в Джерси от нашего партнера по JCG Джерарда Дэвисона в блоге Джерарда Дэвисона .