Chciałbym użyć parametru DateTime
dla Jody w parametrach zapytania w Jersey, ale nie jest to obsługiwane przez aplikację Jersey po instalacji. Zakładam, że implementacja InjectableProvider
jest właściwym sposobem dodania obsługi DateTime
.Używanie Joda DateTime jako parametru Jersey?
Czy ktoś może wskazać mi na dobrą implementację InjectableProvider
dla DateTime
? Czy istnieje alternatywne podejście godne polecenia? (Jestem świadomy, że mogę przekonwertować z Date
lub String
w moim kodzie, ale wydaje się to mniejszym rozwiązaniem).
Dzięki.
Rozwiązanie:
I zmodyfikowana odpowiedź Gili jest poniżej używać mechanizmu @Context
wtrysku w JAX-RS zamiast Guice.
Aktualizacja: To może nie działać poprawnie, jeśli UriInfo nie zostanie wprowadzone w parametrach metody obsługi.
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));
}
};
}
}
Dzięki, Gili. Nie używam Guice, ale zastanawiam się, czy UriInfo można wstrzyknąć za pomocą wstrzyknięcia JAX-RS @Context? – HolySamosa
Yep, @Context służy do wstrzykiwania UriInfo. Również nieznacznie zmodyfikowałem twój kod, aby obsłużyć przypadek zerowych parametrów zapytania DateTime. Moja adaptacja została opublikowana jako edycja mojego pytania. Dzięki!! – HolySamosa