gpt4 book ai didi

java - Spring Data JPA 方法 + REST : Enum to Integer conversion

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:14 26 4
gpt4 key购买 nike

我有一个端点:

/api/offers/search/findByType?type=X

哪里X应该是 Integer值(我的 OfferType 实例的序数值),而 Spring 考虑 X一个String并将应用其 StringToEnumConverterFactoryStringToEnum转换器。

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:我试着写一个 Converter<String, OfferType>在我得到String之后来自 TypeDescriptor.forObject(value) , 它没有帮助。

EDIT4:我的问题是我已将自定义转换器注册放入 MVC 配置(WebMvcConfigurerAdapteraddFormatters)而不是 REST 存储库配置(RepositoryRestConfigurerAdapterconfigureConversionService) .

最佳答案

Spring 将查询参数解析为字符串。我相信它总是使用 Converter<String, ?>转换器将查询参数转换为存储库方法参数。它使用增强型转换器服务,因为它注册了 its own converters例如 Converter<Entity, Resource> .

因此你必须创建一个 Converter<String, OfferType> ,例如:

@Component
public class StringToOfferTypeConverter implements Converter<String, OfferType> {

@Override
public OfferType convert(String source) {
return OfferType.class.getEnumConstants()[Integer.valueOf(source)];
}
}

然后在扩展类 RepositoryRestConfigurerAdapter 中配置此转换器以供 Spring Data REST 使用:

@Configuration
public class ConverterConfiguration extends RepositoryRestConfigurerAdapter {

@Autowired
StringToOfferTypeConverter converter;

@Override
public void configureConversionService(ConfigurableConversionService conversionService) {
conversionService.addConverter(converter);
super.configureConversionService(conversionService);
}
}

我试图将其添加到 the basic tutorial ,向 Person 类添加了一个简单的枚举:

public enum OfferType {
ONE, TWO;
}


@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private OfferType type;


public OfferType getType() {
return type;
}

public void setType(OfferType type) {
this.type = type;
}
}

当我打电话时:

http://localhost:8080/people/search/findByType?type=1

我得到的结果没有错误:

{
"_embedded" : {
"people" : [ ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/search/findByType?type=1"
}
}
}

要实现全局枚举转换器,您必须创建一个工厂并使用以下方法在配置中注册它:conversionService.addConverterFactory() .下面的代码是修改后的 example from the documentation :

public class StringToEnumFactory implements ConverterFactory<String, Enum> {

public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
return new StringToEnum(targetType);
}

private final class StringToEnum<T extends Enum> implements Converter<String, T> {

private Class<T> enumType;

public StringToEnum(Class<T> enumType) {
this.enumType = enumType;
}

public T convert(String source) {
Integer index = Integer.valueOf(source);
return enumType.getEnumConstants()[index];
}
}
}

关于java - Spring Data JPA 方法 + REST : Enum to Integer conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42791046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com