栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

读取球衣的ParamConverter中的另一个参数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

读取球衣的ParamConverter中的另一个参数

如前所述这里的关键,这是注射一些上下文对象

javax.inject.Provider
,这使我们能够懒洋洋地检索对象。由于
ParamConverterProvider
是由Jersey管理的组件,因此我们应该能够注入其他组件。

问题在于我们需要的组件将位于请求范围内。为了解决这个问题,我们注入

javax.inject.Provider<UriInfo>
了提供者。当我们实际调用
get()
Provider
获得的实际情况
UriInfo
,这将是在一个请求。对于需要请求范围的任何其他组件也是如此。

例如

public class InstantParamProvider implements ParamConverterProvider {    @Inject    private javax.inject.Provider<UriInfo> uriInfoProvider;    @Override    public <T> ParamConverter<T> getConverter(Class<T> rawType,   Type genericType,   Annotation[] annotations) {        if (rawType != Instant.class) return null;        return new ParamConverter<T>() { @Override public T fromString(String value) {     UriInfo uriInfo = uriInfoProvider.get();     String format = uriInfo.getQueryParameters().getFirst("date-format");     if (format == null) {          throw new WebApplicationException(Response.status(400)       .entity("data-format query parameter required").build());     } else {         try {  // parse and return here         } catch (Exception ex) {  throw new WebApplicationException(      Response.status(400).entity("Bad format " + format).build());         }     } } @Override public String toString(T value) {     return value.toString(); }          };    }  }

更新

这是使用Jersey测试框架的完整示例

import java.lang.annotation.Annotation;import java.lang.reflect.Type;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.logging.Logger;import javax.inject.Inject;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.QueryParam;import javax.ws.rs.WebApplicationException;import javax.ws.rs.core.Response;import javax.ws.rs.core.UriInfo;import javax.ws.rs.ext.ParamConverter;import javax.ws.rs.ext.ParamConverterProvider;import org.glassfish.jersey.filter.LoggingFilter;import org.glassfish.jersey.server.ResourceConfig;import org.glassfish.jersey.test.JerseyTest;import org.junit.Test;import static org.junit.Assert.*;import static org.junit.matchers.JUnitMatchers.*;public class LocalDateTest extends JerseyTest {    public static class LocalDateParamProvider implements ParamConverterProvider {        @Inject        private javax.inject.Provider<UriInfo> uriInfoProvider;        @Override        public <T> ParamConverter<T> getConverter(Class<T> rawType,     Type genericType,     Annotation[] annotations) { if (rawType != LocalDate.class) {     return null; } return new ParamConverter<T>() {     @Override     public T fromString(String value) {         UriInfo uriInfo = uriInfoProvider.get();         String format = uriInfo.getQueryParameters().getFirst("date-format");         if (format == null) {  throw new WebApplicationException(Response.status(400)          .entity("date-format query parameter required").build());         } else {  try {      return (T) LocalDate.parse(value, DateTimeFormatter.ofPattern(format));      // parse and return here  } catch (Exception ex) {      throw new WebApplicationException(   Response.status(400).entity("Bad format " + format).build());  }         }     }     @Override     public String toString(T value) {         return value.toString();     } };        }    }    @Path("localdate")    public static class LocalDateResource {        @GET        public String get(@QueryParam("since") LocalDate since) { return since.format(DateTimeFormatter.ofPattern("MM/dd/yyyy"));        }    }    @Override    public ResourceConfig configure() {        return new ResourceConfig(LocalDateResource.class)     .register(LocalDateParamProvider.class)     .register(new LoggingFilter(Logger.getAnonymousLogger(), true));    }    @Test    public void should_return_bad_request_with_bad_format() {        Response response = target("localdate")     .queryParam("since", "09/20/2015")     .queryParam("date-format", "yyyy/MM/dd")     .request().get();        assertEquals(400, response.getStatus());        assertThat(response.readEntity(String.class), containsString("format yyyy/MM/dd"));        response.close();    }    @Test    public void should_return_bad_request_with_no_date_format() {        Response response = target("localdate")     .queryParam("since", "09/20/2015")     .request().get();        assertEquals(400, response.getStatus());        assertThat(response.readEntity(String.class), containsString("query parameter required"));        response.close();    }    @Test    public void should_succeed_with_correct_format() {        Response response = target("localdate")     .queryParam("since", "09/20/2015")     .queryParam("date-format", "MM/dd/yyyy")     .request().get();        assertEquals(200, response.getStatus());        assertThat(response.readEntity(String.class), containsString("09/20/2015"));        response.close();    }}

这是测试依赖项

<dependency>    <groupId>org.glassfish.jersey.test-framework.providers</groupId>    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>    <version>${jersey2.version}</version>    <scope>test</scope></dependency>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/428171.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号