2
votes

i have the following RESTfull method :

    @RequestMapping(value = "/budgetLines",
        method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public void create(@RequestBody BudgetLine budgetLine) {
    System.out.println("Before Persisting in the repository " + budgetLine);
    budgetLineRepository.save(budgetLine);
}

I'am consuming this method inside a web application, i checked using the network analysis tool (in the web developper tool of chrome) that the object sended is valid (all attribute except the id were set with a valid value), but then the object passed to the repository contains only null attributes.

here is an example body :

{
    "Name":"testLabel",
    "Label":"testName",
    "AnnualBudget":9000
}

the class BudgetLine is defined as follows:

@Entity
@Table(name = "T_BUDGETLINE")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class BudgetLine implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "label")
    private String Label;

    @Column(name = "name")
    private String Name;

    @Column(name = "annual_budget", precision=10, scale=2)
    private BigDecimal AnnualBudget;

    @OneToMany(mappedBy = "budgetLine")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Report> reportss = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getLabel() {
        return Label;
    }

    public void setLabel(String Label) {
        this.Label = Label;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public BigDecimal getAnnualBudget() {
        return AnnualBudget;
    }

    public void setAnnualBudget(BigDecimal AnnualBudget) {
        this.AnnualBudget = AnnualBudget;
    }

    public Set<Report> getReportss() {
        return reportss;
    }

    public void setReportss(Set<Report> Reports) {
        this.reportss = Reports;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        BudgetLine budgetLine = (BudgetLine) o;

        if (id != null ? !id.equals(budgetLine.id) : budgetLine.id != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return (int) (id ^ (id >>> 32));
    }

    @Override
    public String toString() {
        return "BudgetLine{" +
                "id=" + id +
                ", Label='" + Label + "'" +
                ", Name='" + Name + "'" +
                ", AnnualBudget='" + AnnualBudget + "'" +
                '}';
    }

    public BudgetLine() {
    }
}
1
Try with first letter in lowercase for parameters, name, label and annualBudget in request body.Predrag Maric
Wow, that was it thank you, never crossed my mindMorty
Great, I've added it as an answer since it helped.Predrag Maric

1 Answers

4
votes

Try with first letter in lowercase for parameters

{
    "name":"testLabel",
    "label":"testName",
    "annualBudget":9000
}

Spring relies heavily on standard Java naming conventions, so I suggest you also follow them. In your example, you should name your class fields with lowercased first letter.