java-POST 方法 415 错误
java-POST method 415 Error
我有 java EE project.I 在服务器端使用 Spring Hibernate,在客户端使用 Backbone,RequireJS,Jquery [=41] =]正在尝试使用 POST 方法保存,但出现 HTTP 415 错误 return。
我的 Get 方法工作正常。我在 Postman 上测试过。
我的url:localhost:8080/rest/travel
已编辑
我的资源Class
@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 Class
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;
}
}
我的服务CLASS
@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
@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
注释。
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
.
我的错误原因是 backbone 代码:
Backbone.emulateJSON = true;
如果 Backbone.emulateJSON=true
, Content-Type= application/x-www-form-urlencoded
.
现在Backbone.emulateJSON=false;
问题解决了!
请将以下内容添加到您的 maven 中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson2.version}</version>
</dependency>
如果您尝试在 POSTMAN 中调用,请添加 Content-Type: application/json 作为 header 参数。
我有 java EE project.I 在服务器端使用 Spring Hibernate,在客户端使用 Backbone,RequireJS,Jquery [=41] =]正在尝试使用 POST 方法保存,但出现 HTTP 415 错误 return。
我的 Get 方法工作正常。我在 Postman 上测试过。
我的url:localhost:8080/rest/travel
已编辑
我的资源Class
@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 Class
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;
}
}
我的服务CLASS
@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
@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
注释。
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
.
我的错误原因是 backbone 代码:
Backbone.emulateJSON = true;
如果 Backbone.emulateJSON=true
, Content-Type= application/x-www-form-urlencoded
.
现在Backbone.emulateJSON=false;
问题解决了!
请将以下内容添加到您的 maven 中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson2.version}</version>
</dependency>
如果您尝试在 POSTMAN 中调用,请添加 Content-Type: application/json 作为 header 参数。