java - 如何使用 @EmbeddedId 使用 Spring Data REST 和 ConversionService?

标签 java spring spring-mvc spring-data-jpa spring-data-rest

我有一个带有返回此 JSON 的 Spring Data REST 的应用程序:

{
  "_embedded" : {
    "persons" : [ {
      "personDetail" : {
        "name" : "Alex",
        "surname" : "Red",
        "id" : {
          "group" : "A",
          "subclass" : "1"
        },
        "_links" : {
          "self" : {
            "href" : "https ://localhost:8080/myApp/api/personDetails/A_1"
          }
        }
      }
     }]
    }
}   

当我访问 url 时:

https://localhost:8080/myApp/api/personDetails/A_1

或此网址:

https://localhost:8080/myApp/api/persons/04ee99a5-1578-400a-84be-d1ca87cda752/personDetail

应用返回此 JSON:

{
  "name" : "Alex",
  "surname" : "Red",
  "_links" : {
    "self" : {
      "href" : "https ://localhost:8080/myApp/api/personDetails/A_1"
    },
    "personDetail" : {
      "href" : "https ://localhost:8080/myApp/api/personDetails/A_1"
    }
  }
}

“id”字段似乎消失了。哪里完成了? 我该怎么做才能获得正确的对象投影?

这是 Person 类:

@Entity
@Table
public class Person {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)", length = 16)
    private UUID id;

    @ManyToOne(fetch = FetchType.EAGER)
    private PersonDetail personDetail;

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public PersonDetail getPersonDetail() {
        return personDetail;
    }

    public void setPersonDetail(PersonDetail personDetail) {
        this.personDetail = personDetail;
    }
}

这是 PersonDetail 类:

@Entity
@Table
public class PersonDetail {
    @EmbeddedId
    private PersonDetailId id;

    @Column
    private String name;

    @Column
    private String surname;

    public PersonDetailId getId() {
        return id;
    }

    public void setId(PersonDetailId id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    protected String[] getExcludeFieldNames() {
        return null;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toStringExclude(this, getExcludeFieldNames());
    }
}

这是 PersonDetailId 类:

public class PersonDetailId implements Serializable {

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

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

    public PersonDetailId() {
        super();
    }

    public PersonDetailId(String group, String subclass) {
        super();
        this.group = group;
        this.subclass = subclass;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public String getSubclass() {
        return subclass;
    }

    public void setSubclass(String subclass) {
        this.subclass = subclass;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append(group).append("_").append(subclass);
        return builder.toString();
    }

}

这是存储库 REST:

@RepositoryRestResource
public interface PersonDetailRepository extends JpaRepository<PersonDetail, PersonDetailId> {

    @RestResource(exported=false)
    PersonDetail findBySurname(String surname);

}

这是我使用的转换器:

@Component
public class PersonDetailIdConverter implements Converter<String, PersonDetailId> {

    @Autowired
    private PersonDetailRepository personDetailRepository;

    @Override
    public PersonDetailId convert(String source) {

        PersonDetailId result = null;

        List<PersonDetail> details = personDetailRepository.findAll();
        for (PersonDetail detail:details) {
            if (detail.getId().toString().equals(source)) {
                result = detail.getId();
                break;
            }
        }

        return result;
    }

}

这是注册转换器的配置:

@Configuration
public class CustomizedRestMvcConfiguration extends RepositoryRestConfigurerAdapter {

    @Bean
    PersonDetailIdConverter personDetailIdConverter(){
        return new PersonDetailIdConverter();
    }

    @Override
    public void configureConversionService(ConfigurableConversionService conversionService) {
        conversionService.addConverter(personDetailIdConverter());
        super.configureConversionService(conversionService);
    }

}

我使用了转换器,因为它是使 url 工作的唯一方法:

“href”:“https://localhost:8080/myApp/api/personDetails/A_1”

有什么想法吗? 谢谢。

编辑

看来这取决于预测。 当我使用我创建的投影转到对象的链接时,返回的 JSON 包含我需要的所有值。

最佳答案

因为this issue其中 ResourceSupport.getId() 上有一个 @JsonIgnore 注释,Spring Data REST 不会导出实体的 ID。但是,您可以重命名它们,例如到 personId(或者只是重命名你的 getter 方法)。

还记得expose your IDs ,正如 Alessandro C 提到的。

关于java - 如何使用 @EmbeddedId 使用 Spring Data REST 和 ConversionService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36570452/

相关文章:

java - PanelImagen[,0,0,0x0,无效,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

java - 从Java文件写入jsp文件

java - spectj 将对象获取到切入点内

java - 如何防止页面刷新? AJAX、Spring MVC

java - 使用 Java 序列化 XML 以进行流式传输的最佳方法?

java - 为什么 java 编译器不为这个转换告诉 'cannot cast error'?

java - JWrapper 示例应用程序无法在 Mac OS X 10.8.5 上启动

java - @SpringBootApplication 在同一个包中?

java - 在 Netbeans 7.3 中包含 Spring MVC

java - eclipse中的spring petclinic编译错误