| [//]: # " Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved. " | |
| [//]: # " " | |
| [//]: # " This program and the accompanying materials are made available under the " | |
| [//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at " | |
| [//]: # " http://www.eclipse.org/org/documents/edl-v10.php. " | |
| [//]: # " " | |
| [//]: # " SPDX-License-Identifier: BSD-3-Clause " | |
| Entity Data Filtering | |
| ===================== | |
| ### *Entity Data Filtering Using custom annotations to filter entities* | |
| This example demonstrates how to define custom entity filtering | |
| annotations (views) and how to apply them on domain classes as well as | |
| on JAX-RS resource classes or JAX-RS resource methods. | |
| The full description how Entity Data Filtering can be found in Jersey User Guide, chapter | |
| [Entity Data Filtering](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html). | |
| Sections relevant to this example (describing this exact example) are: | |
| - [Enabling and configuring Entity Filtering in your application](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html#d0e14229) | |
| - [Components used to describe Entity Filtering concepts](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html#d0e14342) | |
| - [Using custom annotations to filter entities](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html#ef.annotations) | |
| Contents | |
| -------- | |
| The mapping of the URI path space is presented in the following table: | |
| URI path | Resource class | HTTP methods | Allowed values | |
| ----------------------------------------- | ------------------ | -------------- | ---------------- | |
| **_/projects/{id}_** | ProjectsResource | GET | int | |
| **_/projects_** | ProjectsResource | GET | N/A | |
| **_/projects/detailed/{id}_** | ProjectsResource | GET | int | |
| **_/projects/detailed_** | ProjectsResource | GET | N/A | |
| **_/tasks/{id}?detailed={true\|false}_** | TasksResource | GET | int, boolean | |
| **_/tasks_** | TasksResource | GET | N/A | |
| **_/tasks/detailed_** | TasksResource | GET | N/A | |
| **_/users/{id}?detailed={true\|false}_** | UsersResource | GET | int, boolean | |
| **_/tasks?detailed={true\|false}_** | UsersResource | GET | N/A | |
| Application is based on Grizzly container (see `App`). Everything needed | |
| (resources/providers) is registered in `EntityFilteringApplication`. | |
| Sample Response | |
| --------------- | |
| Even though the same instance of, e.g. Project class, is used to create | |
| response for both basic and detailed view the actual data sent over the | |
| wire differ for each of these two views. For basic view it looks like: | |
| ```javascript | |
| { | |
| "description" : "Jersey is the open source (under dual EPL+GPL license) JAX-RS 2.1 (JSR 370) production quality Reference Implementation for building RESTful Web services.", | |
| "id" : 1, | |
| "name" : "Jersey" | |
| } | |
| ``` | |
| And for detailed view it looks like: | |
| ```javascript | |
| { | |
| "description" : "Jersey is the open source (under dual EPL+GPL license) JAX-RS 2.1 (JSR 370) production quality Reference Implementation for building RESTful Web services.", | |
| "id" : 1, | |
| "name" : "Jersey", | |
| "tasks" : [ { | |
| "description" : "Entity Data Filtering", | |
| "id" : 1, | |
| "name" : "ENT_FLT" | |
| }, { | |
| "description" : "OAuth 1 + 2", | |
| "id" : 2, | |
| "name" : "OAUTH" | |
| } ], | |
| "users" : [ { | |
| "email" : "very@secret.com", | |
| "id" : 1, | |
| "name" : "Jersey Robot" | |
| } ] | |
| } | |
| ``` | |
| Running the Example | |
| ------------------- | |
| Run the example as follows: | |
| > mvn clean package exec:java | |
| This deploys current example using Grizzly. You can access the | |
| application at: | |
| - <http://localhost:8080/projects> | |
| - <http://localhost:8080/projects/detailed> | |
| - <http://localhost:8080/users> | |
| - <http://localhost:8080/users?detailed=true> | |
| - <http://localhost:8080/tasks> | |
| - <http://localhost:8080/tasks/detailed> | |
| Using Jackson instead of MOXy | |
| ----------------------------- | |
| This examples uses by default Entity Data Filtering feature together | |
| with MOXy. To switch MOXy JSON provider to Jackson (2.x) JSON provider | |
| simply | |
| - comment registration of MOXy ContextResolver, and\ | |
| `register(new MoxyJsonConfig().setFormattedOutput(true).resolver())` | |
| - uncomment registration of JacksonFeature\ | |
| `register(JacksonFeature.class)` | |
| in `EntityFilteringApplication` class. |