Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring数据REST管理枚举_Java_Spring_Spring Mvc_Spring Data Rest_Spring Rest - Fatal编程技术网

Java 使用Spring数据REST管理枚举

Java 使用Spring数据REST管理枚举,java,spring,spring-mvc,spring-data-rest,spring-rest,Java,Spring,Spring Mvc,Spring Data Rest,Spring Rest,我有一个关于SpringBoot1.5.7、SpringDataREST、Hibernate、HATEOAS和SpringValidation的项目 我真的很难管理枚举。我需要两件简单的事情: 获取特定枚举的项列表(HTTP REST) 将枚举作为参数发送到HTTP REST调用中 我使用的是SpringDataREST,所以应该从中做很多工作 我的枚举是基本的,如: public enum TransitCertificateStatus { PENDING, USED, CANCEL

我有一个关于SpringBoot1.5.7、SpringDataREST、Hibernate、HATEOAS和SpringValidation的项目

我真的很难管理枚举。我需要两件简单的事情:

  • 获取特定枚举的项列表(HTTP REST)
  • 将枚举作为参数发送到HTTP REST调用中
  • 我使用的是SpringDataREST,所以应该从中做很多工作

    我的枚举是基本的,如:

    public enum TransitCertificateStatus {
        PENDING, USED, CANCELED, ARCHIVED
    }
    
    此枚举用于bean:

    @Entity
    @EntityListeners(TransitCertificateListener.class)
    public class TransitCertificate extends AbstractEntity {
        private static final long serialVersionUID = 5978999252424024545L;
    
        @NotNull(message = "{NotNull.transitcertificate.status}")
        @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private TransitCertificateStatus status = TransitCertificateStatus.PENDING;
    
    要向客户端公开枚举项,我创建了一个自定义控制器:

    @Api(tags = "TransitCertificate Entity")
    @RepositoryRestController
    @RequestMapping(path = "/api/v1/transitCertificates")
    public class TransitCertificateController {
        private Logger log = LogManager.getLogger();
    
    @RequestMapping(method = RequestMethod.GET, path = "/states", produces = "application/json")
        public @ResponseBody ResponseEntity<?> getTransitCertificateStates() {
            Resources<TransitCertificateStatus> resources = new Resources<TransitCertificateStatus>(
                    Arrays.asList(TransitCertificateStatus.values()));
            return ResponseEntity.ok(resources);
        }
    
    注意,这些项被转换是因为我将这些值设置为rest-messages.properties和Spring数据,rest负责转换

    server.model.enums.TransitCertificateStatus.PENDING = In attesa
    server.model.enums.TransitCertificateStatus.USED = Utilizzato
    server.model.enums.TransitCertificateStatus.CANCELED = Annullato
    server.model.enums.TransitCertificateStatus.ARCHIVED = Archiviato
    
    到目前为止,一切都如预期的那样。 现在,我需要获得一个按bean
    TransitCertificate
    筛选的存储库列表,并将存储库作为REST资源直接公开:

    @RepositoryRestResource
    @Transactional
    @PreAuthorize("isAuthenticated()")
    public interface TransitCertificateRepository extends PagingAndSortingRepository<TransitCertificate, Long> {
    
     @Transactional(readOnly = true)
    @Query("SELECT t FROM TransitCertificate t WHERE (:code IS NULL OR code=:code) AND (:date IS NULL OR DATE(createdDate)=DATE(:date)) AND (:text IS NULL OR text LIKE CONCAT('%',:text,'%')) AND (:from IS NULL OR t.from LIKE CONCAT('%',:from,'%')) AND (:customerName IS NULL OR customerName LIKE CONCAT('%',:customerName,'%')) AND (:states IS NULL OR status IN (:states)) ")
    public Page<TransitCertificate> findAllByParameters(@Param("code") @RequestParam(value = "code", required = false) String code,
            @Param("date") @RequestParam(value = "date", required = false) Instant date,
            @Param("text") @RequestParam(value = "text", required = false) String text,
            @Param("from") @RequestParam(value = "from", required = false) String from,
            @Param("customerName") @RequestParam(value = "customerName", required = false) String customerName,
            @Param("states") @RequestParam(value = "states", required = false) List<TransitCertificateStatus> states, Pageable pageable);
    
    
    @Transactional(readOnly = true)
    @Query("SELECT t FROM TransitCertificate t WHERE (:#{#filter} IS NULL OR t.status=:#{#filter.status}) ")
    public Page<TransitCertificate> findAllByParameters2(@RequestBody @RequestParam(value="filter") @Param("filter") TransitCertificateFilter filter,
            Pageable pageable);
    
    所以我尝试了另一种方法

    第二种方法

    这次我创建了一个bean作为过滤器,它包含了查询中应该过滤的所有参数

        public class TransitCertificateFilter implements Serializable {
    
        private TransitCertificateStatus status;
    
        public TransitCertificateStatus getStatus() {
            return status;
        }
    
        public void setStatus(TransitCertificateStatus status) {
            this.status = status;
        }
    
    }
    
    在方法
    findAllByParameters2
    中,我使用SpEL从客户端发送的bean中获取属性
    status

    请求如下:

    {
    "status":"Annullato"
    }
    
    这是我回来的一个例外:

    {
      "timestamp": "2017-10-12T15:46:20.292+0000",
      "status": 500,
      "error": "Internal Server Error",
      "exception": "org.springframework.expression.spel.SpelEvaluationException",
      "message": "EL1007E: Property or field 'status' cannot be found on null",
      "path": "/api/v1/transitCertificates/search/findAllByParameters2"
    }
    
    我搜索了一些关于这个的信息,但没有找到任何有用的。有人能让我走上正确的道路吗

    {
    "status":"Annullato"
    }
    
    {
      "timestamp": "2017-10-12T15:46:20.292+0000",
      "status": 500,
      "error": "Internal Server Error",
      "exception": "org.springframework.expression.spel.SpelEvaluationException",
      "message": "EL1007E: Property or field 'status' cannot be found on null",
      "path": "/api/v1/transitCertificates/search/findAllByParameters2"
    }