java - 返回枚举名称和字符串值作为 api 响应

标签 java spring-boot rest jpa enums

这是我的枚举类

public enum Status {
    OPEN("Open"),
    IN_PROCESS("In Process"),
    ON_HOLD("On Hold"),
    RESOLVED("Resolved");

    private String status;

    Status(String status) {
        this.status = status;
    }

    @JsonValue
    public String getStatus() {
        return status;
    }
}

我的 api 当前正在以字符串形式返回 Status 的值,这是返回的 json 响应的一部分。 {"id":1,"name":"John","subject":"帮助","status":"打开"}

如何让我的回复类似于 {"status": {"id": "ON_HOLD", "value": "On Hold"}}

这是使用枚举状态的模型,省略了一些部分。

public class Ticket {
    private @Id @GeneratedValue(strategy=GenerationType.IDENTITY) Long id;
    private String name;
    private String subject;

    @Enumerated(EnumType.STRING)
    private Status status;

    //getters, setters, etc.
}

我的票务 Controller

@RestController
public class TicketController {
    private final TicketRepository repository;
    private final TicketResourceAssembler assembler;

    TicketController(TicketRepository repository, TicketResourceAssembler assembler) {
        this.repository = repository;
        this.assembler = assembler;
    }

    @GetMapping("/tickets/{id}")
    public EntityModel<Ticket> one(@PathVariable Long id) {

        Ticket ticket = repository.findById(id).orElseThrow(() -> new EntityNotFoundException(Ticket.class, "id", id.toString()));
        return assembler.toModel(ticket);
    }
}

汇编器

@Component
public class TicketResourceAssembler implements RepresentationModelAssembler<Ticket, EntityModel<Ticket>> {
    @Override
    public EntityModel<Ticket> toModel(Ticket ticket) {

        EntityModel<Ticket> ticketResource = new EntityModel<>(ticket,
            linkTo(methodOn(TicketController.class).one(ticket.getId())).withSelfRel(),
            linkTo(methodOn(TicketController.class).all()).withRel("tickets"));

        return  ticketResource;
    }
}

存储库只是一个扩展至JpaRepository的接口(interface)。

最佳答案

您需要添加getName()方法枚举类:

public enum Status {
        OPEN("Open"),
        IN_PROCESS("In Process"),
        ON_HOLD("On Hold"),
        RESOLVED("Resolved");

        private String status;

        Status(String status) {
            this.status = status;
        }

        public String getName() {
            return this.name();
        }

        @JsonValue
        public String getStatus() {
            return status;
        }
    }

现在您需要在 Ticket 类中添加 @JsonGetter 方法来获取状态:

@JsonGetter
    public JsonNode getStatus() {
        return JsonNodeFactory.instance.objectNode().put("id",status.getName()).put("value",status.getValue());
    }

关于java - 返回枚举名称和字符串值作为 api 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61570375/

相关文章:

Java 数组在退出 for 循环后变为零

java - 如何更改 hashmap 中键的值

spring-boot - 如何使用 jib-maven-plugin 构建 docker 镜像,但默认不推送?

java - 使用 Swagger 获取以单个 JSON 记录的 REST API

c# - Rally C# : Is it possible to create a new user story along with an attachment?(避免查询用户故事引用)

java - 如何从网络 (Windows) 获取用户名?

java - 我的项目不想完成同步

java - 如何在 Spring JPA 存储库中加入多个表的结果

java - 微服务开发中spring boot应用返回对象列表出错

android - Flask POST 400 访问请求 JSONObject 时出错