Jersey (JAX-RS) @BeanParam to inject class with aggregated @*Param injections

It will reduce our code and improve readability, if we define injections of various @*Param values in a distinct class and reuse that in various resources. In Jersey (JAX-RS) we can achieve same using @BeanParam injection.

Aggregate @*Param injections in one class to use with @FormBean

Aggregate @*Param injections in one class and use @BeanParam to inject that class in Resources.

This is a part of Jersey (JAX-RS) Restful Web Services Development Guides series. Please read Jersey + Spring Boot getting started guide.

Define Class for aggregating multiple @*Param values

File: BeanParamModel.java

package in.geekmj.model;

import javax.ws.rs.CookieParam;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;

import org.jvnet.hk2.annotations.Optional;

public class BeanParamModel {

	@HeaderParam(value = "header-value")
	private String headerValue;

	@CookieParam(value = "cookie-value")
	private String cookieValue;

	private String pathValue;

	private String param1;

	public BeanParamModel(@PathParam("path-value") @Optional String pathValue,
			@QueryParam("param1") @Optional String param1) {
		this.pathValue = pathValue;
		this.param1 = param1;
	}

	public String getHeaderValue() {
		return headerValue;
	}

	public void setHeaderValue(String headerValue) {
		this.headerValue = headerValue;
	}

	public String getCookieValue() {
		return cookieValue;
	}

	public void setCookieValue(String cookieValue) {
		this.cookieValue = cookieValue;
	}

	public String getPathValue() {
		return pathValue;
	}

	public void setPathValue(String pathValue) {
		this.pathValue = pathValue;
	}

	public String getParam1() {
		return param1;
	}

	public void setParam1(String param1) {
		this.param1 = param1;
	}

}

Inject above class with @BeanParam in resource class

package in.geekmj.resource;

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import javax.ws.rs.GET;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.springframework.stereotype.Component;

import in.geekmj.model.BeanParamModel;

@Path("/bean-param")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Component
public class BeanParamResource {

	@GET
	@Path("{path-value}")
	public Response getResponse(@BeanParam BeanParamModel beanParam) {

		Map<String, String> parametersValues = new HashMap<String, String>();

		parametersValues.put("header-value", beanParam.getHeaderValue());
		parametersValues.put("cookie-value", beanParam.getCookieValue());
		parametersValues.put("path-value", beanParam.getPathValue());
		parametersValues.put("param1", beanParam.getParam1());

		return Response.ok(parametersValues).build();
	}
}

Testing GET request for URL http://localhost:8080/bean-param/path-value-random?param1=paramvalue1 with Postman Chrome Plugin.

Response for URI /bean-param/{path}/

Response for URI /bean-param/{path}/

References

  1. Official Jersey Documentation
Download Icon SmallDownload the Full ProjectGithub IconFollow Project On Github

One Reply to “Jersey (JAX-RS) @BeanParam to inject class with aggregated @*Param injections”

Leave a Reply

Your email address will not be published. Required fields are marked *