enum转换

xam8gpfp  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(422)

我使用的是springboot1.5.4、springdatarest和hateoas。我将rest端点暴露在一个Angular 客户端上。
我在用 spring.data.rest.enable-enum-translation=true 转换枚举。它在两种情况下都很好用 GET 以及 POST 从spring数据公开的请求来自存储库。
我在存储库中添加了一个自定义方法:

@Transactional(readOnly = true)
@PreAuthorize("isAuthenticated()")
public interface TransitCertificateRepository extends PagingAndSortingRepository<TransitCertificate, Long> {   

    @Query("SELECT t FROM TransitCertificate t WHERE :states IS NULL OR status IN (:states) ")
    public Page<TransitCertificate> findAllByParameters(
            @Param("states") @RequestParam(value = "states", required = false) List<TransitCertificateStatus> states, Pageable pageable);

这是枚举:

public enum TransitCertificateStatus {
         PENDING, USED, CANCELED, ARCHIVED
    }

这是模型的相关部分:

@Entity
@EntityListeners(TransitCertificateListener.class)
public class TransitCertificate extends AbstractEntity {
    private static final long serialVersionUID = 5978999252424024545L;

    @NotNull(message = "The status cannot be empty")
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private TransitCertificateStatus status = TransitCertificateStatus.PENDING;

rest-messages.properties 我把枚举翻译成:

server.model.enums.TransitCertificateStatus.PENDING = Pending
server.model.enums.TransitCertificateStatus.USED = Used

当客户端试图调用我的方法时 findAllByParameters 并发送一个字符串数组(翻译服务器如何发回),服务器上的转换失败。例如,我不明白为什么转换在save()方法中有效,但在我的方法中无效。此外,如果客户端向我发送2个状态,spring将返回以下错误:

Parameter value element [USED] did not match expected type [server.model.enums.TransitCertificateStatus (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value element [USED] did not match expected type [server.model.enums.TransitCertificateStatus (n/a)]

所以我想我有两个问题:
由于某些原因,spring无法转换 String[]List<TransitCertificateStatus> 即使值正好是transitcertificatestatus中定义的值(挂起、使用、取消、存档)
当值是中定义的值之一时,spring无法将客户端发送的字符串转换为正确的枚举 rest-messages.properties (等待、使用等)。
有没有一种方法可以解决这个问题?一种优雅的方法是使用spring数据rest的内部工具(我指出enum transation在save()方法中工作),而无需重新设计轮子?

lf5gs5x2

lf5gs5x21#

我最终以这样的方式解决了这个问题:
我创建了一个定制的@repositoryrestcontroller
我创造了我的方法
我从客户端像字符串一样获取枚举,然后转换它。这样,客户机还可以发送枚举的已翻译字符串
这是一段代码:

@PostMapping(path = "/licensePlates/searches")
    public ResponseEntity<?> search(@RequestBody(required = true) List<Filter> filters, Pageable pageable, Locale locale,
            PersistentEntityResourceAssembler resourceAssembler) {
EngineType engineType = enumTranslator.fromText(EngineType.class, filterMap.get("engineType"));

你必须这样做:

@Autowired
private EnumTranslator enumTranslator;

不确定是不是最好的方法,但这解决了我的问题与小代码。

相关问题