当前位置: 首页 > 知识库问答 >
问题:

使用Spring从Java对象中排除字段

彭阳荣
2023-03-14
@PostMapping("/searchCarBigList")
public ResponseEntity<Cars> searchBigList(
        @Parameter(description = "some searchRequest dto") @RequestBody SearchRequest searchRequest) {

    return ResponseEntity.ok(someService.search(searchRequest));
}


@PostMapping("/searchCarSmallList")
public ResponseEntity<Cars> searchSmallList(
        @Parameter(description = "some searchRequest dto") @RequestBody SearchRequest searchRequest) {

    return ResponseEntity.ok(someService.search(searchRequest));
}




@Table(name = "CAR_TABLE")
public class Cars {

    @Id
    @Column(name = "ID")
    private Long id;

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

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

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

    @Column(name = "TRANSMISSION", nullable = false)
    private String transmission;
    
    
    Getters and Setters
}

我有两个endpoint使用相同的模型类(Cars)。对于search chBigListendpoint,我想检索所有汽车字段,而对于search chCarSmallListendpoint,我想只检索3个字段。我尝试使用@JsonView注释来做到这一点,但它对我不起作用。有人知道如何做到这一点吗?

共有3个答案

丁震博
2023-03-14

我完全同意托德·哈特的观点,即使用DTO更好、更容易。

尽管如此,我不知道您是如何尝试使用@JSonView注释的。我在一些DTO中使用它。让@JsonView注释工作的一种方法是首先创建一个接口。即。:

public interface Views {
    public static interface Simple {
    }

    public static interface Detailed extends Simple {
    }

    ...
}

然后您需要引用要应用它们的字段上方的视图,如下所示:

@JsonView(Views.Simple.class)
private String someField;

@JsonView(Views.Detailed.class)
private String anotherField;

...

之后,需要将实体对象转换为MappingJacksonValue,如下所示:

...
var responseObject = new MappingJacksonValue(obj);
responseObject.setSerializationView(Views.Simple.class);
...

这是使@JsonView注释按预期工作的方法之一。然而,只使用DTO并将实体转换为您创建的适当响应DTO要容易得多(也更好)。您可以制作任意数量的DTO。使用DTO映射请求主体也是一个好主意。这样,您可以轻松控制请求体中允许哪些字段,即POST/PUT/PATCH请求。看看ModelMapper和/或ObjectMapper类。这些可以用于在DTO之间转换实体。

子车才捷
2023-03-14

您可以有一个只有3个基本字段的汽车模型类。这个对象可以用于任何只需要这3个字段的web服务。

在您的情况下,searchCarSmallListendpoint。

扩展车型类

在另一个endpoint中访问这个新类,该endpoint需要所有5个字段。

如果上述方法不可行,则使用

小坚果。copyProperties,其中可以明确提及在显示/返回之前要忽略的字段名。

郎成龙
2023-03-14

使用JPA实体作为DTO是一个坏主意,因为一旦进入任何更复杂的模式,就会遇到与分离实体和延迟计算等相关的问题。

您的控制器应该只处理具有所需属性的单独DTO类对象,然后您可以将其构建为您想要的样子。服务层接口应该只提及这些DTO,而不是实体类。

只有存储库层应该按照实体类编写,因此服务层应该在DTO和实体之间进行转换(接受并返回DTO,将实体传递给repo层)。

最终,这将为你节省大量的时间和痛苦的任何现实世界类型的项目。有很多工具和习惯用法用于处理DTO

 类似资料:
  • 当我在输入字段中输入object fields值时,我想从ArrayList中删除一个对象。 我有一个超类,我将添加不同米的一般信息。 然后我有一个时钟类,它扩展了超类,并有更多的值。 然后我有一个archive类,它创建了一个arrayList,其中包含不同的对象,并且当用户收到一个字段的提示时,会有一个删除对象的方法,在该字段中,他们可以将“regNum”作为字符串键入。 然后计划是,它迭代列

  • 问题内容: 我有一个具有静态对象ArrayList的ClassA 现在,我要像这样从此列表中删除一个对象 这是用Meteorit类编写的。但是,当我想使用ArrayList中的对象时,它将引发异常。 我使用Iterator从ArrayList中删除对象,但是现在我不知道如何在这种情况下使用它。 问题答案: 这是因为某个线程实际上正在for每个循环中查看此列表,也许您正在尝试在for-each主体中

  • 基本上,我不希望在生成的JSON文件中出现任何空的JSON数组或对象。我已经使用以下方法相应地配置了ObjectMapper: 这适用于数组、集合和字符串。但是,如果我有一个空对象(=所有属性都为null或empty),它仍然会显示在生成的JSON中,如下所示:

  • 问题内容: 我有一个(尽管我猜这个问题也适用于其他集合)对象。据我了解,当文档讨论删除映射时,那么它就是从哈希表中删除条目,即不一定破坏实际对象。如果该表中唯一剩余的对该对象的引用,那么该对象会被垃圾回收吗? 如果我这样做了,并且表中的那些对象没有在其他任何地方引用,它们会被垃圾回收吗? 最快的方法是实际从表中删除所有条目,同时销毁那些对象。 问题答案: 是的,如果集合是最后引用这些对象的地方,则

  • 问题内容: 如果满足条件,我需要从中删除一些对象,我想知道哪种方法会更有效。 情况如下:我有一个包含包含其他一些对象的类。我必须对此进行迭代,并删除满足特定条件的所有元素。据我所知,这些是我要删除的选项: 创建一个新的并添加不符合条件的元素。迭代之后,从旧的数组列表交换到没有元素的新数组列表。 创建一个新的并添加满足条件的元素。迭代后,使用传递要删除对象的方法。 有没有更有效的方法从中删除对象?

  • 问题内容: 我正在获取一个json响应并将其存储在mongodb中,但是我不需要的字段也正在进入数据库中,是否仍要剥离unseccary字段? 输出: 问题答案: 您可以使用从给定对象中选取某些属性的函数: 然后: