【问题标题】:java service 400 bad request errorjava服务400错误请求错误
【发布时间】:2015-10-07 06:34:08
【问题描述】:

亲爱的 Spring Java 专业人士

请帮我解决这个问题: 我在春天有一个自定义服务,当我运行它时,我的 Wildfly 服务器上没有任何错误。但是当我执行以下更新请求时,我收到了 400 个错误请求,尽管我发送了控制器中指定的格式

在我的控制器内部:

@RequestMapping(value = "/user/updatefilters/{Id}", method = RequestMethod.POST)
    public Response updateFilter(@PathVariable("Id") Long Id, @RequestBody @Valid Filter Filter) {

        FilterService.updateFilter(Id, Filter);

        HashMap<String, Object> response = new HashMap<>();
        response.put("messages", null);
        response.put("success", Boolean.valueOf(true));
        return Response.instance().friendlyName("filter-updated").object(response).statusCode(HttpStatus.OK);
}

在我的服务文件中:

public void updateFilter(Long Id,Filter Filter) {
    List<Filter> currentFilter = FilterRepo.getFilters(Id, Filter.getFilterId().longValue(),null);
    currentFilter.get(0).setLabel(Filter.getLabel());
    FilterRepo.save(currentFilter.get(0));

    for (FilterField FilterField : Filter.getFilterFields()) {
        FilterField currentFilterField = FilterFieldRepo.getFilterField(FilterField.getfieldId());
        if (currentFilterField != null) {
            currentFilterField.setfield(FilterField.getfield());
            currentFilterField.setTypeId(FilterField.getTypeId());
            FilterFieldRepo.save(currentFilterField);
        }           
    }   
}

在我的存储库中:

public List<Filter> getFilterList(Long Id, String type) {
    List<Filter> FilterField = FilterFieldRepo.getFilterFields(Id,type);
    return FilterField;
}   

public void updateFilter(Long Id,Filter Filter) {
    List<Filter> currentFilter = FilterRepo.getFilters(Id, Filter.getFilterId().longValue(),null);
    currentFilter.get(0).setLabel(Filter.getLabel());
    FilterRepo.save(currentFilter.get(0));

    for (FilterField FilterField : Filter.getFilterFields()) {
        FilterField currentFilterField = FilterFieldRepo.getFilterField(FilterField.getfieldId());
        if (currentFilterField != null) {
            currentFilterField.setfield(FilterField.getfield());
            currentFilterField.setTypeId(FilterField.getTypeId());
            FilterFieldRepo.save(currentFilterField);
        }           
    }   
}

请注意,在我的实体中,我添加了一个像这样的临时列表:

@Transient
private List<FilterField> filterFields;

更新: 这是我的过滤器类,我在 netbeans 中生成了 crud,但手动添加了 transuent 列表:

@Entity
@Table(schema="hitmeister",name = "filters")
@NamedQueries({
    @NamedQuery(name = "Filter.findAll", query = "SELECT s FROM Filter s"),
    @NamedQuery(name = "Filter.findByFilterId", query = "SELECT s FROM Filter s WHERE s.filterId = :filterId"),
    @NamedQuery(name = "Filter.findById", query = "SELECT s FROM Filter s WHERE s.Id = :Id"),
    @NamedQuery(name = "Filter.findByLabel", query = "SELECT s FROM Filter s WHERE s.label = :label"),
    @NamedQuery(name = "Filter.findByInsertionDate", query = "SELECT s FROM Filter s WHERE s.insertionDate = :insertionDate"),
    @NamedQuery(name = "Filter.findByIsActive", query = "SELECT s FROM Filter s WHERE s.isActive = :isActive"),
    @NamedQuery(name = "Filter.findByType", query = "SELECT s FROM Filter s WHERE s.type = :type")})
public class Filter implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "filter_id")
    private Integer filterId;
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private int Id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 500)
    @Column(name = "label")
    private String label;
    @Basic(optional = true)
    @Column(name = "insertion_date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date insertionDate;
    @Column(name = "is_active")
    private Boolean isActive;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "type")
    private String type;

    @Transient
    private List<FilterField> filterFields;

    public Filter() {
    }

    public Filter(Integer filterId) {
        this.filterId = filterId;
    }

    public Filter(Integer filterId, int Id, String label, Date insertionDate, String type) {
        this.filterId = filterId;
        this.Id = Id;
        this.label = label;
        this.insertionDate = insertionDate;
        this.type = type;
    }

    public Integer getFilterId() {
        return filterId;
    }

    public void setFilterId(Integer filterId) {
        this.filterId = filterId;
    }

    public int getId() {
        return Id;
    }

    public void setuserId(int Id) {
        this.userId = userId;
    }

    public String getLabel() {
        return label;
    }

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

    public Date getInsertionDate() {
        return insertionDate;
    }

    public void setInsertionDate(Date insertionDate) {
        this.insertionDate = insertionDate;
    }

    public Boolean getIsActive() {
        return isActive;
    }

    public void setIsActive(Boolean isActive) {
        this.isActive = isActive;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (filterId != null ? filterId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Filter)) {
            return false;
        }
        Filter other = (Filter) object;
        if ((this.filterId == null && other.filterId != null) || (this.filterId != null && !this.filterId.equals(other.filterId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return " Filter #"+ filterId ;
    }

    public List<FilterField> getFilterFields() {
        return filterFields;
    }

    public void setFilterFields(List<FilterField> filterFields) {
        this.filterFields = filterFields;
    }


}

如果您需要我的实体代码,我也可以发布它 提前致谢!

【问题讨论】:

  • FilterFieldRepo.save(currentFilterField); 在做什么??这是从你得到 400 的地方还是你的意思是你的浏览器到服务器是 400?不清楚。
  • 日志应该有错误...可以发一下吗?
  • 当我从浏览器请求时,它给了我 400 @hagrawal
  • @jny jboss 控制台没有错误我没有编译错误,我应该检查哪个其他日志?
  • 你有申请日志吗?

标签: java spring


【解决方案1】:

您的请求格式不是 Spring 所期望的,或者 Filter 验证之一失败。添加一个org.springframework.validation.Errors 参数并转储值以找出哪些验证失败。

public Response updateFilter(@PathVariable("Id") Long Id, @RequestBody @Valid Filter Filter, Errors filterErrors) {

您可以使用 curl 或网络监控工具来嗅探实际流量,以确保 HTTP 事务确实如您所想。

编辑:查看了您的一个 cmets 中的 JSON,我认为这将在您的 JSON 字段名称中变成大写/小写。将“Id”更改为“id”,将“FilterId”更改为“filterId”,或者使用@XmlElement(name = "Id")@XmlElement(name = "FilterId") 注释Filter 字段。 Java Bean 属性名称区分大小写。

编辑 2:Filter.setuserId(int Id) 也坏了。您需要一个 setId() 方法来反序列化 bean,并且您需要更改该方法以便它存储传递的参数,而不仅仅是将 userId 设置为自身。

【讨论】:

  • 感谢@Kevin Condon,所以除非我有监控工具,否则添加 org.springframework.validation.Errors 不会让我看到错误?
  • 您不需要网络监控,只需添加一些代码即可从注入的Errors 参数中打印出数据。像if (filterErrors.hasErrors()) { // iterate over filterErrors.getAllErrors() } 这样的东西。见stackoverflow.com/a/7384449/125344
【解决方案2】:

我的第一个建议: (OP 试过但没用,她正在发送 POST 请求)

如下更改您的映射,我认为您应该没问题。 来自浏览器地址栏的请求是 GET 请求。

如下所示,HTTP 400 是在服务器无法理解客户端正在发送的请求时出现的,在您的情况下,您发送的是 GET,但服务器除了 POST 之外什么都没有,所以是 400。

W3C HTTP 400

10.4.1 400 错误请求

由于格式错误,服务器无法理解请求 句法。客户端不应该重复请求 修改。

代码修复:

@RequestMapping(value = "/user/updatefilters/{Id}", method = RequestMethod.GET)


我的第二个建议:

我不是 Spring 专家,但这是我的 2 美分,您可以根据您提供的 JSON 对象和您的过滤器映射来尝试 - (1.) 将 userId 更改为 Id,(2.) 有 @987654325 @ 为 NULL,而不是空字符串。

确保您的 JSON 字符串变量与您的 Filter 类映射区分大小写,并且它们的值与引用类型兼容。

【讨论】:

  • GET 请求不应具有请求正文。同样错误的方法由 405 状态码指示,而不是 400
  • 我试过了但仍然有 400 ,我也尝试使用 PUT 但它是一样的
  • @sisimh 看看第二个推荐。
  • @sisimh 您是如何解决您的问题或仍未解决的?
  • 感谢您的帮助我的所有问题都在我的 JSON 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2012-04-27
  • 2015-11-24
  • 2011-09-29
  • 2014-01-11
  • 2017-12-27
  • 1970-01-01
相关资源
最近更新 更多