【发布时间】:2017-08-05 02:05:42
【问题描述】:
我有一个端点:
/api/offers/search/findByType?type=X
其中X 应该是Integer 值(我的OfferType 实例的序数值),而Spring 将X 视为String 并将其StringToEnumConverterFactory 与StringToEnum 转换器一起应用.
public interface OfferRepository extends PagingAndSortingRepository<Offer, Long> {
List<Offer> findByType(@Param("type") OfferType type);
}
所以我写了一个自定义的Converter<Integer, OfferType>,它只是通过给定的序号获取一个实例:
public class IntegerToOfferTypeConverter implements Converter<Integer, OfferType> {
@Override
public OfferType convert(Integer source) {
return OfferType.class.getEnumConstants()[source];
}
}
然后我用Configuration正确注册了它:
@EnableWebMvc
@Configuration
@RequiredArgsConstructor
public class GlobalMVCConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new IntegerToOfferTypeConverter());
}
}
我预计对findByType?type=X 的所有请求都将通过我的转换器,但事实并非如此。
有什么方法可以说所有定义为请求参数的枚举都必须作为Integer 提供?此外,有什么方法可以在全球范围内说它,而不仅仅是针对特定的枚举?
编辑:我在我的类路径中找到了IntegerToEnumConverterFactory,它可以满足我的所有需求。它注册到DefaultConversionService,这是一个默认的转换服务。如何应用?
EDIT2:这是一件微不足道的事情,我想知道是否有一个属性可以打开枚举转换。
EDIT3:在从TypeDescriptor.forObject(value) 得到String 之后,我尝试写一个Converter<String, OfferType>,但没有帮助。
EDIT4: 我的问题是我已将自定义转换器注册放入 MVC 配置(WebMvcConfigurerAdapter 和 addFormatters)而不是 REST 存储库之一(RepositoryRestConfigurerAdapter 和 configureConversionService) .
【问题讨论】:
-
这个问题与 Spring Data 或 JPA 有什么关系?
-
因为他使用的是 Spring Data JPA?安德鲁,您要查询的实体是否在适当的字段上有 @Enumerated 注释?如此处所述:stackoverflow.com/questions/17242408/…
-
@PaulNUK,不,它没有
-
@StefanK。他通过 Spring Data REST 使用存储库到 REST 端点的自动映射。它创建自己的控制器。 OP 可能应该在问题中指定这一点,但它有正确的标签。
标签: java spring spring-boot spring-data-jpa spring-data-rest