【问题标题】:java-POST method 415 Errorjava-POST方法415错误
【发布时间】:2017-09-07 08:59:30
【问题描述】:

我有 java EE 项目。我在服务器端使用 Spring Hibernate,在这个项目的客户端使用 Backbone、RequireJS、Jquery。我正在尝试使用 POST 方法保存,但返回 HTTP 415 错误。

我的 Get 方法工作正常。我在 Postman 上测试过。

我的网址:localhost:8080/rest/travel

已编辑

我的资源类

    @Component
@Path("/travel")
public class TravelResource {

        @Autowired
        private TravelService travelService;
       @Autowired
      private UserService userService;

    @POST
    @Produces(MediaType.APPLICATION_JSON+ ";charset=UTF-8")
    @Consumes(MediaType.APPLICATION_JSON)
        public TravelDTO save(TravelDTO dto) {
        dto.setUser(userService.get(dto.getUser().getUserID()));
          dto.setTravelStart(new Date());
          dto.setTravelEnd(new Date());

          return travelService.save(dto);
        }

    @PUT
    @Path("/{travelID}")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
        public TravelDTO edit(@PathParam("travelID") int id, TravelDTO dto) {
        dto.setUser(userService.get(dto.getUser().getUserID()));
        dto.setTravelStart(new Date());
        dto.setTravelEnd(new Date());

        return travelService.edit(id,dto);
        }

    @DELETE
    @Path("/{travelID}")
    @Produces(MediaType.TEXT_PLAIN)
        public int delete(@PathParam("travelID") int id) {
        travelService.delete(id);
        return id;
        }
    @GET
    @Path("/{travelID}")
    @Produces(MediaType.APPLICATION_JSON)
        public TravelDTO get(int id) {
        return travelService.get(id);
        }
    @GET
    @Produces(MediaType.APPLICATION_JSON)
        public List<TravelDTO> getAll() {
        return travelService.getAll();

        }

    @GET
    @Path("/search/{travelStart}/{travelEnd}/" )
    @Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
    public List<TravelDTO> search(@PathParam("travelStart") Date travelStart,
                                  @PathParam("travelEnd") Date travelEnd )
    {
        return travelService.search(travelStart,travelEnd);
    }

}

我的 DTO 课程

public class TravelDTO implements Serializable {

    public TravelDTO convert(Travel model) {
        this.setTravelID(model.getTravelID());
        this.setTravelCost(model.getTravelCost());
        this.setTravelStart(model.getTravelStart());
        this.setTravelEnd(model.getTravelEnd());
        this.setLocation(model.getLocation());
        this.setTravelPurpose(model.getTravelPurpose());
       this.setProjectCode(model.getProjectCode());
       this.setUser(new UserDTO().convert(model.getUser()));
        return this;
    }
        private int travelID;

       private String projectCode;

        private Date travelStart;

        private Date travelEnd;

        private String Location;

        private float travelCost;

        private UserDTO user;

        private String travelPurpose;

    public UserDTO getUser() {
        return user;
    }

    public void setUser(UserDTO user) {
        this.user = user;
    }

    public String getProjectCode() {
        return projectCode;
    }

    public void setProjectCode(String projectCode) {
        this.projectCode = projectCode;
    }

    public int getTravelID() {
            return travelID;
        }

        public void setTravelID(int travelID) {
            this.travelID = travelID;
        }

        public Date getTravelStart() {
            return travelStart;
        }

        public void setTravelStart(Date travelStart) {
            this.travelStart = travelStart;
        }

        public Date getTravelEnd() {
            return travelEnd;
        }

        public void setTravelEnd(Date travelEnd) {
            this.travelEnd = travelEnd;
        }

        public String getLocation() {
            return Location;
        }

        public void setLocation(String location) {
            Location = location;
        }

        public float getTravelCost() {
            return travelCost;
        }

        public void setTravelCost(float travelCost) {
            this.travelCost = travelCost;
        }

        public String getTravelPurpose() {
            return travelPurpose;
        }

        public void setTravelPurpose(String travelPurpose) {
            this.travelPurpose = travelPurpose;
        }

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

        TravelDTO travelDTO = (TravelDTO) o;

        return travelID == travelDTO.travelID;
    }

    @Override
    public int hashCode() {
        return travelID;
    }
}

我的服务类

@Service
public class TravelService {
        @Autowired
        private TravelDAO travelDAO;

        @Transactional
        @ResponseBody
        public TravelDTO save(TravelDTO dto) {
            Travel station = new Travel();
            station.convert(dto);
            try {
                station = travelDAO.persist(station);
            } catch (Exception e) {
                return null;
            }
            return dto.convert(station);
        }

        @Transactional
        @ResponseBody
        public TravelDTO edit(int id, TravelDTO dto) {
            Travel travel = new Travel();
            try {
                travel.convert(dto);
                travelDAO.merge(travel);
            } catch (Exception e) {
                return null;
            }
            return dto.convert(travel);
        }

        @Transactional
        @ResponseBody
        public boolean delete(int id) {
            try {
                Travel travel = travelDAO.find(id);
                travelDAO.remove(travel);
            } catch (Exception e) {
                return false;
            }
            return true;
        }

        public TravelDTO get(int id) {
            Travel travel;
            try {
                travel = travelDAO.find(id);
            } catch (Exception e) {
                return null;
            }
            return new TravelDTO().convert(travel);
        }

        public List<TravelDTO> getAll() {
            List<TravelDTO> travelDTOList = new ArrayList<TravelDTO>();
            try {
                for (Travel travel : travelDAO.findAll())
                    travelDTOList.add(new TravelDTO().convert(travel));
            } catch (Exception e) {
                return null;
            }
            return travelDTOList;
        }

        public List<TravelDTO> search(Date startTime, Date endTime)
                                      {
            List<TravelDTO> travelDTOList = new ArrayList<TravelDTO>();
            try {
                for (Travel station : travelDAO.search(startTime, endTime))
                    travelDTOList.add(new TravelDTO().convert(station));
            } catch (Exception e) {
                return null;
            }
            return travelDTOList;
        }




}

我的数据:

model:{"Location":"s","projectCode":"51","travelPurpose":"s","travelStart":"1.1.1","travelEnd":"8.12.2016"}

网络标签

enter image description here

【问题讨论】:

  • 415 Unsupported Media Type 请求实体具有服务器或资源不支持的媒体类型。例如客户端上传图片为image/svg+xml,但服务器要求图片使用不同的格式。您可以发布正在发送的消息吗?
  • 添加了我的帖子数据@MosheArad
  • 您应该在此处添加 DTO 对象结构。模型类不是必需的。
  • @gaganbm 添加了 dto 和服务
  • 我已经添加了答案。您可以通过 curl 或 postman 尝试,并设置正确的标题。

标签: java spring hibernate backbone.js


【解决方案1】:

如果您尝试在 POSTMAN 中调用,请添加 Content-Type: application/json 作为标头参数。

【讨论】:

    【解决方案2】:

    请在您的 maven 中添加以下内容:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson2.version}</version>
        </dependency>
    

    【讨论】:

      【解决方案3】:

      我的错误原因是这个主干代码:

      Backbone.emulateJSON = true;
      

      如果Backbone.emulateJSON=trueContent-Type= application/x-www-form-urlencoded

      现在Backbone.emulateJSON=false; 问题解决了!

      【讨论】:

        【解决方案4】:

        HTTP 415 什么时候出现

        The origin server is refusing to service the request because the payload is in 
        a format not supported by this method on the target resource.
        

        参考:https://httpstatuses.com/415

        您需要正确设置请求标头。根据您附加的图像,您正在传递Content-Type: application/x-www-form-urlencoded。 但是您的代码需要application/json

        【讨论】:

          【解决方案5】:
              @POST
              @Produces(MediaType.APPLICATION_JSON+ ";charset=UTF-8")
              @Consumes(MediaType.APPLICATION_JSON)
                  public TravelDTO save(TravelDTO dto) {
                  dto.setUser(userService.get(dto.getUser().getUserID()));
                    dto.setTravelStart(new Date());
                    dto.setTravelEnd(new Date());
          
                    return travelService.save(dto);
                  }
          

          你回来了:return travelService.save(dto);

          并且您声明要返回一个 HTTP JSON

          然后只需将注释 @RestController 而不是 @Controller 添加到您的控制器。

          或者只是将@ResponseBody 注解添加到您的方法中。

          【讨论】:

          • 我正在使用 Rest。所以我没有控制器类。我只有(模型、服务、资源、dao 和 dto)但我在 POST 方法中添加了@ResponseBody,但同样的 415 错误仍在继续
          • “我没有控制器”是什么意思?如果您不使用 Spring 控制器,您希望服务器如何接收来自最终用户的请求?
          • gist.github.com/berat703/1b54549eecfc4e09534fe1b24e824591 。我的服务类期望从我的服务器接收来自最终用户的请求。我应该删除“@Service”并添加“@RestController”吗?
          • 我没有找到解决方案。抱歉打扰:(
          猜你喜欢
          • 2019-01-26
          • 1970-01-01
          • 2018-09-16
          • 2018-06-13
          • 2018-07-14
          • 2022-01-06
          • 2016-03-13
          • 2020-09-30
          • 2020-12-17
          相关资源
          最近更新 更多