Spring Data REST存储库中的枚举转换

时间:2017-07-14 15:36:12

标签: java spring spring-boot spring-data-rest

我使用Spring Boot 1.5.4,Spring Data REST,HATEOAS。我公开要从Angular客户端使用的REST端点。

我使用spring.data.rest.enable-enum-translation=true转换枚举。它在从存储库中从Spring Data REST公开的GETPOST请求中都可以正常工作。

我在存储库中添加了一个自定义方法:

@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并发送一个String数组(翻译服务器发回的方式)时,服务器上的转换失败。 我不明白为什么转换在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)]

所以我想我有两个问题:

  1. 由于某种原因,即使该值恰好是TransitCertificateStatus(PENDING,USED,CANCELED,ARCHIVED)中定义的值,Spring也无法将String[]转换为List<TransitCertificateStatus>
  2. 当值为rest-messages.properties(待定,已使用等)中定义的值之一时,Spring无法将客户端发送的String转换为右枚举。
  3. 有没有办法解决问题是使用Spring Data REST内部工具的优雅方式(我指出enum transation在save()方法中工作)而不重新发明轮子?

1 个答案:

答案 0 :(得分:1)

我最终以这种方式解决了问题:

  • 我创建了一个自定义的@RepositoryRestController
  • 我创建了我的方法
  • 我从客户端获取枚举,就像一个字符串,然后我转换它。通过这种方式,客户端也可以发送enum的翻译字符串

这段代码:

@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"));

你必须以这种方式注入enumTranslation:

@Autowired
private EnumTranslator enumTranslator;

不确定是最好的方法,但用很少的代码解决了我的问题。