【问题标题】:Getting null values for the other fields of a mapped table in JSON response (Spring Boot, REST)在 JSON 响应(Spring Boot,REST)中获取映射表的其他字段的空值
【发布时间】:2018-04-19 12:02:51
【问题描述】:

我是 Spring Boot 和 REST API 的新手,当我在 mysql 表中保存一行时,获取映射表字段的空值 JSON 响应。但是这些字段具有该映射表中的值。

我正在使用 Postman 以 JSON 格式发送请求。

我不知道如何获取包含所有字段值的响应。下面我提到了代码。

控制器类:

@RestController
public class HelpDeskController<T> extends RestUtils<T> {
    @Autowired
    HelpDeskService hService;
    @RequestMapping(value = "/helpDesk/createTicket", method = RequestMethod.POST, headers = "Accept=application/json")
        public @ResponseBody Object setTicket(@Valid @RequestBody HelpDesk ticket) {
            try {
                return getSuccessResponse(hService.setTicket(ticket));
            } catch (StudawnException e) {
                return getErrorResponse(e.getMessage());
            }
        }
}

服务类:

@Service
    public class HelpDeskServiceImpl implements HelpDeskService {
        @Autowired
        HelpDeskRepository helpDeskRepository;

        @Override
        public Object setTicket(HelpDesk ticket) throws StudawnException {
            if (ticket == null)
                throw new StudawnException(ErrorCode.NULL_REQUEST);
            else {

                return helpDeskRepository.save(ticket);
            }
        }
}

模型类

@Entity
@Table(name = "Help_Desk")
public class HelpDesk {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ticket_id")
    private int ticketId;

    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "student_id")
    private Student student;

    @ManyToOne
    @JoinColumn(name = "category_id",nullable=false,updatable=false)
    private Category category;

    @ManyToOne
    @JoinColumn(name = "sub_category_id",nullable=false,updatable=false)
    private SubCategory subCategory;

    @Column(name = "ticket_desc", length = 300)
    private String ticketDesc;

    @Column(name = "status")
    private short status;

    @Column(name = "response", length = 300)
    private String response;

    @Column(name = "date_created", nullable = false, updatable = false)
    private Date dateCreated;

    @Column(name = "date_closed")
    private Date dateClosed;

    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }

    public SubCategory getSubCategory() {
        return subCategory;
    }

    public void setSubCategory(SubCategory subCategory) {
        this.subCategory = subCategory;
    }

    public int getTicketId() {
        return ticketId;
    }

    public void setTicketId(int ticketId) {
        this.ticketId = ticketId;
    }

    public String getTicketDesc() {
        return ticketDesc;
    }

    public void setTicketDesc(String ticketDesc) {
        this.ticketDesc = ticketDesc;
    }

    public short getStatus() {
        return status;
    }

    public void setStatus(short status) {
        this.status = status;
    }

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }

    public Date getDateClosed() {
        return dateClosed;
    }

    public void setDateClosed(Date dateClosed) {
        this.dateClosed = dateClosed;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

}

Postman 中的 JSON 请求:

{
        "category" : {"categoryId": 1515},
        "subCategory" : {"subCategoryId": 1502},
        "student" : { "studentId":1101},
        "ticketDesc": "Ticket Desc21",
        "status":12,
        "response": "Resp12",
        "dateCreated": "2018-03-12",
        "dateClosed": "2018-04-12"
}

JSON 响应:

为映射表中的字段获取空值,但不为用于映射的字段(外键)获取空值。

{
    "response": {
        "ticketId": 22,
        "category": {
            "categoryId": 1515,
            "categoryName": null,
            "createdDate": null
        },
        "subCategory": {
            "subCategoryId": 1502,
            "subCategoryName": null,
            "createdDate": null
        },
        "ticketDesc": "Ticket Desc21",
        "status": 12,
        "response": "Resp12",
        "dateCreated": "2018-03-12T00:00:00.000+0000",
        "dateClosed": "2018-04-12T00:00:00.000+0000"
    },
    "status": 200
}

【问题讨论】:

  • 您需要向我们展示您的“HelpDesk”课程(假设这是您的“票证”模型)。 Spring 将尝试将 JSON 中的所有值绑定到该类的字段,反之亦然,因此命名必须相同(或通过 @JSONProperty 配置),因此可以使用 getter 和 setter。
  • @BennettDams 嗨,我已经添加了我的模型类(HelpDesk)谢谢。

标签: java json rest spring-boot


【解决方案1】:

@ResponseBody 尝试将其方法的返回值转换为 JSON(默认情况下) - 当您通过 hService.setTicket(ticket) 返回 HelpDesk 对象时,Spring 将 HelpDesk 的所有字段映射到它的 JSON 值。在您的HelpDesk 类中,您的category 字段来自Category 类型,因此Category 类的所有字段都必须完全像JSON 字段一样命名,以便Spring 能够将它们与getter/setter 绑定。

您也可以使用@JSONProperty 注释将您的类字段绑定到Categoryclass 中的JSON 名称:When is the @JsonProperty property used and what is it used for?

【讨论】:

  • 我尝试通过将@JSONProperty 添加到我的 Category 类的字段中,但它不起作用。寻求其他解决方案。谢谢。
猜你喜欢
  • 2019-04-08
  • 2018-02-17
  • 2020-12-17
  • 2021-01-07
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多