【问题标题】:Spring Boot JPA specification-arg-resolver JOINED TableSpring Boot JPA 规范-arg-resolver 已加入表
【发布时间】:2021-06-04 15:57:29
【问题描述】:

我正在尝试使用 REST 查询过滤器接口编写 Spring Boot 应用程序。

我想要达到的目标:localhost:8080/persons/search?age=42&city=Berlin&skilltype=Sport

基本类型(String、Int、...)的正常过滤已经成功运行。我在过滤另一个表的属性时遇到问题。

@Entity

public class Person {

  @Id
  @Column(name = "id", nullable = false)
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(name = "age")
  private Integer age;

  @Column(name = "city")
  private String city;

  @Column(name = "skills")
  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name = "person_id")
  private Set<Skill> skills;

@Entity
public class Skill {

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

  @Column(name = "name", nullable = false)
  private String name;

  @Column(name = "type", nullable = false)
  private String type;
}

控制器

import net.kaczmarzyk.spring.data.jpa.domain.*;
import net.kaczmarzyk.spring.data.jpa.web.annotation.And;
import net.kaczmarzyk.spring.data.jpa.web.annotation.Join;

  @GetMapping(value = "/persons/search", produces = MediaType.APPLICATION_JSON_VALUE)
  public ResponseEntity<List<Person>> getPersonBySpecification(
      @Join(path = "skills", alias = "s")
          @And({
            @Spec(path = "id", params = "id", spec = Equal.class),
            @Spec(path = "name", params = "name", spec = EqualIgnoreCase.class),
            @Spec(path = "age", params = "age", spec = Equal.class),
            @Spec(path = "city", params = "city", spec = Like.class),
            @Spec(path = "zipCode", params = "zipCode", spec = In.class),
            @Spec(path = "s.name", params = "skillname", spec = In.class),
            @Spec(path = "s.type", params = "skilltype", spec = In.class),
          })
          Specification<Person> spec) {
    return ResponseEntity.ok().body(this.personService.getPersonBySpecification(spec));
  }

异常java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "cause" is null

非常感谢您的任何建议!

【问题讨论】:

    标签: java spring spring-boot hibernate jpa


    【解决方案1】:

    这个问题花费了我很多时间,尤其是神经!

         <dependency>
                <groupId>net.kaczmarzyk</groupId>
                <artifactId>specification-arg-resolver</artifactId>
                <version>2.6.2</version>
            </dependency>
    

    不兼容 java 16!

    我能够在 Java8 Docker 容器中成功运行上述代码。

    #
    # Build stage
    #
    FROM maven:3.6.0-jdk-11-slim AS build
    COPY src /home/app/src
    COPY pom.xml /home/app
    RUN mvn -f /home/app/pom.xml clean package
    
    #
    # Package stage
    #
    FROM openjdk:8-jre-slim
    COPY --from=build /home/app/target/app-0.0.1-SNAPSHOT.jar /usr/local/lib/app.jar
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/usr/local/lib/app.jar"]
    
    

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多