我想过滤掉一个 REST API 响应的 User bean 属性/字段,但不过滤另一个 REST API 响应。我目前面临错误。我该如何解决这个问题?

问题描述 投票:0回答:1

我有以下豆...

用户.class:

@JsonFilter("UserFilter")
public class User {

    private int id;

    @Size(min = 2, message = "Name should have at least 2 characters")
    private String name;

    @JsonProperty("Birth Date")
    @Past(message = "Birth date should be in the past")
    private LocalDate birthDate;

    public User(int id, String name, LocalDate birthDate) {
        this.id = id;
        this.name = name;
        this.birthDate = birthDate;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", birth=" + birthDate +
                '}';
    }
}

我有以下数据访问对象... UserDaoService.class:

@Component
public class UserDaoService {

    private static List<User> users = new ArrayList<>();

    static {
        users.add(new User(1, "Alice", LocalDate.now()
                .minusYears(18)
                .minusMonths(1)));
        users.add(new User(2, "Bob", LocalDate.now()
                .minusYears(21)
                .plusMonths(3)
                .plusDays(5)));
        users.add(new User(3, "Cathy", LocalDate.now()
                .minusDays(7)
                .minusYears(25)));
        users.add(new User(4, "David", LocalDate.now()
                .minusYears(23)));
    }

    public List<User> findAll() {
        return users;
    }

    public User findById(int id) {
        return users.stream()
                .filter(user -> user.getId() == id)
                .findFirst()
                .orElse(null);
    }
}

以下是我实现的控制器... 用户控制器:

@RestController
public class UserController {

    private UserDaoService service;

    public UserController(UserDaoService service) {
        this.service = service;
    }

    @GetMapping("/users")
    public MappingJacksonValue findAllUsers() {
        List<User> usersList = service.findAll();
        MappingJacksonValue mjv = new MappingJacksonValue(usersList);
        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("name", "Birth Date");
        FilterProvider filters = new SimpleFilterProvider().addFilter("UserFilter", filter);
        mjv.setFilters(filters);
        return mjv;
    }

    @GetMapping("/users/{id}")
    public EntityModel<User> findUserById(@PathVariable int id) {
        User usr = service.findById(id);
        if (usr == null)
            throw new UserNotFoundException("id:" + id);

        EntityModel<User> model = EntityModel.of(usr);
        WebMvcLinkBuilder link = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(this.getClass()).findAllUsers());
        model.add(link.withRel("all-users"));
        return model;
    }
}

在控制器中,当我返回用户列表时,我尝试过滤掉用户的名称。当我尝试通过特定 ID 查找用户时,我不想过滤掉任何内容,但我确实想添加指向 findAllUsers 页面的链接。 当我使用当前的实现向 localhost:8080/users/3 发出 GET 请求时,我从堆栈跟踪中得到以下信息:

HttpMessageConversionException: type definition error: [simple type, class SpringBootFramwork.RESTAPI.beans.User]

caused by InvalidDefinitionException: Cannot resolve PropertyFilter with id 'UserFilter'; no FilterProvider configured (through reference chain: org.springframework.hateoas.EntityModel["content"])

我不知道为什么或如何解决这个问题。

对 localhost:8080/users/3 的 GET 请求的预期输出是:

{
    "id": 3,
    "name": "Cathy",
    "Birth Date": "1999-04-19",
    "_links": {
        "all-users": {
            "href": "http://localhost:8080/users"
        }
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>SpringBoot-Framwork</groupId>
    <artifactId>REST-API</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>REST-API</name>
    <description>Java Web Services Udemy</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-hateoas</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-rest-hal-explorer</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
java spring rest
1个回答
0
投票

事实证明@JsonFilter不允许您选择何时过滤掉实体中的元素。您每次都需要配置 FilterProvider。

以下链接确实有帮助: 不带 @JsonFilter 注解的 Jackson JSON 过滤器

© www.soinside.com 2019 - 2024. All rights reserved.