java - Spring Data REST 存储库中的枚举翻译

标签 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转换枚举。它在 GET 中都运行良好。和POST从存储库中的 Spring Data REST 公开的请求。

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

@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. 出于某种原因,Spring 无法转换 String[]List<TransitCertificateStatus>即使该值正是 TransitCertificateStatus 中定义的值(PENDING、USED、CANCELED、ARCHIVED)
  2. 当该值是 rest-messages.properties 中定义的值之一时,Spring 无法将客户端发送的字符串转换为正确的枚举。 (待处理、已使用等)。

有没有一种方法可以解决这个问题,即使用 Spring Data REST 的内部设施(我指出枚举转换在 save() 方法中工作)的优雅方式,而不需要重新发明轮子?

最佳答案

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

  • 我创建了一个自定义@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"));

您必须以这种方式注入(inject) enumTranslation:

@Autowired
private EnumTranslator enumTranslator;

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

关于java - Spring Data REST 存储库中的枚举翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45106815/

相关文章:

java - 使用 spring-boot-starter-hateoas 时找不到 org.springframework.hateoas.Resource 和 org.springframework.hateoas.mvc.ControllerLinkBuilder

java - 使用 C 语言通过 FFmpeg 保存部分视频

java - Spring中的反射错误

java - 为什么要转换为接口(interface)而不是转换为 java 类?

java - Ektorp 依赖导致 Spring boot 应用程序崩溃

java - spring security spring session,session不存储在spring session中

java - Java 中的常规字符串到 IDNA

Java加运算符

java - String 类型中的方法 format(String, Object[]) 不适用于参数 (String, int, int)

java - 在没有 ModelAndView 的 Spring MVC 4 中以 301 状态重定向