मैं जर्सी में क्वेरी पैरामीटर के लिए जोडा के DateTime
का उपयोग करना चाहता हूं, लेकिन यह जर्सी द्वारा ऑफ़-द-बॉक्स द्वारा समर्थित नहीं है। मुझे लगता है कि InjectableProvider
को लागू करना DateTime
समर्थन जोड़ने का उचित तरीका है।जर्सी डेटटाइम का उपयोग जर्सी पैरामीटर के रूप में करना?
क्या कोई मुझे InjectableProvider
के DateTime
के लिए एक अच्छा कार्यान्वयन करने के लिए इंगित कर सकता है? या क्या सिफारिश करने के लायक एक वैकल्पिक दृष्टिकोण है? (मुझे पता है कि मैं अपने कोड में Date
या String
से परिवर्तित कर सकता हूं, लेकिन यह एक कम समाधान की तरह लगता है)।
धन्यवाद।
समाधान:
मैं नीचे जिली का जवाब Guice JAX-रुपये के बजाय में @Context
इंजेक्शन प्रणाली का उपयोग करने के लिए संशोधित।
अद्यतन: यदि आपकी सेवा विधि पैरामीटर में UriInfo इंजेक्शन नहीं दिया गया है तो यह ठीक से काम नहीं कर सकता है।
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider;
import java.util.List;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;
import org.joda.time.DateTime;
/**
* Enables DateTime to be used as a QueryParam.
* <p/>
* @author Gili Tzabari
*/
@Provider
public class DateTimeInjector extends PerRequestTypeInjectableProvider<QueryParam, DateTime>
{
private final UriInfo uriInfo;
/**
* Creates a new DateTimeInjector.
* <p/>
* @param uriInfo an instance of {@link UriInfo}
*/
public DateTimeInjector(@Context UriInfo uriInfo)
{
super(DateTime.class);
this.uriInfo = uriInfo;
}
@Override
public Injectable<DateTime> getInjectable(final ComponentContext cc, final QueryParam a)
{
return new Injectable<DateTime>()
{
@Override
public DateTime getValue()
{
final List<String> values = uriInfo.getQueryParameters().get(a.value());
if(values == null || values.isEmpty())
return null;
if (values.size() > 1)
{
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).
entity(a.value() + " may only contain a single value").build());
}
return new DateTime(values.get(0));
}
};
}
}
धन्यवाद, गिली। मैं गुइस का उपयोग नहीं कर रहा हूं, लेकिन मुझे आश्चर्य है कि क्या UriInfo को JAX-RS के @Context इंजेक्शन से इंजेक्शन दिया जा सकता है? – HolySamosa
हाँ, @Context UriInfo इंजेक्शन के लिए काम करता है। मैंने शून्य कोडटाइम क्वेरी पैरामीटर के मामले को संभालने के लिए थोड़ा सा कोड भी संशोधित किया है। मेरा अनुकूलन मेरे प्रश्न के संपादन के रूप में पोस्ट किया गया है। धन्यवाद!! – HolySamosa