官术网_书友最值得收藏!

The JAX-RS layer

If we step back one second and think about which stopover the application will execute, we can identify a few of them:

  • HTTP communication handling
  • Payload (un)marshalling
  • Routing
  • Service invocation

Because of the separation of concern principles, or simply for technical constraints between layers, it is very common to use a Data Transfer Object between the JAX-RS/front layer and the CDI/business layer. Of course, this statement can be applied to the business sub-layers as well, but in the case of this book, we will just do it in the JAX-RS layer. To make it obvious in the book, we will prefix the JAX-RS model with Json. Check out the following code snippet:

@JsonbPropertyOrder({"id", "name", "customerCount"})
public class JsonQuote {
private long id;
private String name;
private double value;

@JsonbProperty("customer_count")
private long customerCount;

// getters/setters
}

In this context, the front layer role is to delegate most of the logic to the service layer and convert the business model to the front model (it can almost be seen as a Java to JavaScript conversion for a lot of modern applications):

@Path("quote")
@RequestScoped
public class QuoteResource {
@Inject
private QuoteService quoteService;

@GET
@Path("{id}")
public JsonQuote findById(@PathParam("id") final long id) {
return quoteService.findById(id) // delegation to the business
layer
.map(quote -> { // the model conversion
final JsonQuote json = new JsonQuote();
json.setId(quote.getId());
json.setName(quote.getName());
json.setValue(quote.getValue());

json.setCustomerCount(ofNullable(quote.getCustomers())
.map(Collection::size).orElse(0));
return json;
})
.orElseThrow(() -> new
WebApplicationException(Response.Status.NO_CONTENT));
}

// other methods
}
We set the JAX-RS @ApplicationPath to  /api to ensure that our endpoints are deployed under the  /api subcontext.
主站蜘蛛池模板: 铜陵市| 汉寿县| 祁阳县| 天峻县| 葫芦岛市| 拉萨市| 师宗县| 永靖县| 镇巴县| 松潘县| 六盘水市| 黔江区| 湘潭县| 桐庐县| 宁海县| 杭锦旗| 盐源县| 郴州市| 辽中县| 平安县| 鹤山市| 永嘉县| 南川市| 梅河口市| 土默特右旗| 芷江| 广州市| 台南市| 双鸭山市| 衡阳县| 宁阳县| 滦平县| 巴彦县| 东光县| 马公市| 石家庄市| 兖州市| 陆川县| 甘德县| 甘孜县| 乐昌市|