Spring 使用带有数据表的DTO限制实体的公开属性

Spring 使用带有数据表的DTO限制实体的公开属性,spring,hibernate,datatables,Spring,Hibernate,Datatables,我试图通过dto限制实体的属性数量,并使用datatable显示它们。我也找到了实现,但每次发送post请求时,它都会在postman上抛出(“没有找到接口java.util.function.function的主构造函数或默认构造函数”),并在STS控制台上抛出“java.lang.NoSuchMethodException:java.util.function.function.()” 我已经为实体和DTO创建了构造函数,但没有用 这是我下面的实现:() 这是这个的控制器 这是我的控制器:

我试图通过dto限制实体的属性数量,并使用datatable显示它们。我也找到了实现,但每次发送post请求时,它都会在postman上抛出(“没有找到接口java.util.function.function的主构造函数或默认构造函数”),并在STS控制台上抛出“java.lang.NoSuchMethodException:java.util.function.function.()”

我已经为实体和DTO创建了构造函数,但没有用

这是我下面的实现:() 这是这个的控制器

这是我的控制器:

    @JsonView(DataTablesOutput.View.class)
    @RequestMapping(value = "api/libraryitemspojo", method = RequestMethod.POST)
    public DataTablesOutput<LibraryItemDataTableDTO> getLibraryItemsPojo(@Valid @RequestBody DataTablesInput input, Function<LibraryItem,LibraryItemDataTableDTO> converter) {
        return libraryItemsdtr.findAll(input, converter);

    }

这就是实体

public class LibraryItem {

 public LibraryItem() {}

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonView(DataTablesOutput.View.class)
    private Long id;


    @ManyToOne
    @JoinColumn(name = "FkStatus")
    private MetaStatus status;



    @ManyToOne
    @JoinColumn(name = "FkLibraryCategory")
    private LibraryCategory libraryCategory;


    @OneToMany(mappedBy = "item")
    @JsonView(DataTablesOutput.View.class)
    private List<LibraryItemLanguage> itemLanguageList;

    @OneToMany(mappedBy = "item")
    private List<LibraryItemOpt> itemOptList;


    @OneToMany(mappedBy = "item")
    @JsonView(DataTablesOutput.View.class)
    private List<LibraryItemImages> itemImageList;

    @ManyToOne
    @JoinColumn(name = "CreatedBy")
    private User CreatedBy;


    @Column(name = "CreatedAt")
    private Date created;


    @ManyToOne
    @JoinColumn(name = "UpdatedBy")
    private User UpdatedBy;


    @Column(name = "UpdatedAt")
    private Date updated;

    @JsonView(DataTablesOutput.View.class)
    private String barcode;

}
公共类库项目{
公共图书馆项目(){}
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@JsonView(DataTablesOutput.View.class)
私人长id;
@许多酮
@JoinColumn(name=“FkStatus”)
私人身份;
@许多酮
@JoinColumn(name=“FkLibraryCategory”)
私人图书馆类别图书馆类别;
@OneToMany(mappedBy=“项目”)
@JsonView(DataTablesOutput.View.class)
私有列表项语言列表;
@OneToMany(mappedBy=“项目”)
私有列表项目列表;
@OneToMany(mappedBy=“项目”)
@JsonView(DataTablesOutput.View.class)
私有列表项图像列表;
@许多酮
@JoinColumn(name=“CreatedBy”)
由用户创建的私有用户;
@列(name=“CreatedAt”)
创建私人日期;
@许多酮
@JoinColumn(name=“UpdatedBy”)
私人用户更新人;
@列(name=“UpdatedAt”)
更新私人日期;
@JsonView(DataTablesOutput.View.class)
私有字符串条形码;
}
我的存储库

public interface LibraryItemsDataTables extends DataTablesRepository<LibraryItem, Long> {

}


public接口LibraryItemsDataTables扩展了DataTablesRepository{
}

我知道这是个老问题,但我认为我应该发布我的发现,这样会有帮助

您可以通过在LibraryItemDataTableDTO中创建一个方法来解决此问题,该方法返回转换器的实现。请参阅下面使用实体和DTO类的代码

public static Function<LibraryItem , LibraryItemDataTableDTO> getConverter() {
        return (LibraryItem item) -> {
            return new LibraryItemDataTableDTO(item.getId(),item.getBarCode());
        };
    }
公共静态函数getConverter(){
返回(LibraryItem项目)->{
返回新的LibraryItemDataTableDTO(item.getId(),item.getBarCode());
};
}
在此之后,您的控制器看起来像

@JsonView(DataTablesOutput.View.class)
    @RequestMapping(value = "api/libraryitemspojo", method = RequestMethod.POST)
    public DataTablesOutput<LibraryItemDataTableDTO> getLibraryItemsPojo(@Valid @RequestBody DataTablesInput input, Function<LibraryItem,LibraryItemDataTableDTO> converter) {
        return libraryItemsdtr.findAll(input, LibraryItemDataTableDTO.getConverter());

    }
@JsonView(datatableoutput.View.class)
@RequestMapping(value=“api/libraryitemspojo”,method=RequestMethod.POST)
公共DataTablesOutput getLibraryItemsPojo(@Valid@RequestBody DataTablesInput输入,函数转换器){
返回libraryItemsdtr.findAll(输入,LibraryItemDataTableDTO.getConverter());
}

此解决方案在我的情况下也适用。:)

我知道这是个老问题,但我认为我应该发布我的发现,这样会有帮助

您可以通过在LibraryItemDataTableDTO中创建一个方法来解决此问题,该方法返回转换器的实现。请参阅下面使用实体和DTO类的代码

public static Function<LibraryItem , LibraryItemDataTableDTO> getConverter() {
        return (LibraryItem item) -> {
            return new LibraryItemDataTableDTO(item.getId(),item.getBarCode());
        };
    }
公共静态函数getConverter(){
返回(LibraryItem项目)->{
返回新的LibraryItemDataTableDTO(item.getId(),item.getBarCode());
};
}
在此之后,您的控制器看起来像

@JsonView(DataTablesOutput.View.class)
    @RequestMapping(value = "api/libraryitemspojo", method = RequestMethod.POST)
    public DataTablesOutput<LibraryItemDataTableDTO> getLibraryItemsPojo(@Valid @RequestBody DataTablesInput input, Function<LibraryItem,LibraryItemDataTableDTO> converter) {
        return libraryItemsdtr.findAll(input, LibraryItemDataTableDTO.getConverter());

    }
@JsonView(datatableoutput.View.class)
@RequestMapping(value=“api/libraryitemspojo”,method=RequestMethod.POST)
公共DataTablesOutput getLibraryItemsPojo(@Valid@RequestBody DataTablesInput输入,函数转换器){
返回libraryItemsdtr.findAll(输入,LibraryItemDataTableDTO.getConverter());
}
此解决方案在我的情况下也适用。:)