gpt4 book ai didi

java - Spring 4,REST 服务从 Tomcat 返回 415 错误

转载 作者:行者123 更新时间:2023-11-28 22:50:38 25 4
gpt4 key购买 nike

我正在尝试使用 Spring 4 在 REST 服务中测试 POST 方法。它在我使用 MockMvcBuilders.standaloneSetup 的集成测试中运行良好,但我将它部署在 Tomcat 8.5.8 中,我可以不明白为什么它不起作用。我收到此消息:

                              HTTP Status 415 -

type Status report

message

description The server refused this request because the request entity
is in a format not supported by the requested resource for the
requested method.
________________

但 Tomcat 服务器收到此请求(从 wireshark 中提取):

POST /app-1.0-SNAPSHOT/v1.0/concentrators/ HTTP/1.1 
User-Agent: curl/7.35.0
Host: x.x.x.x:8080
Accept: */*
Content-Type: application/json
Content-Length: 528 {"street":"street","num":"num","code":"code","town":"town"
,"descriptionRoom":"descriptionRoom","btPwd":"btPwd"
,"gprsPwd":"gprsPwd","gprsLogin":"gprsLogin","gprsApn":"gprsApn"
,"gprsPin":"gprsPin","motherboardId":"motherboardId","logLevel":0
,"frameSendPeriod":0,"frameCapturePeriod":0,"mQTTServerPwd":"mQTTServerPwd"
,"mQTTServerUser":"mQTTServerUser","mQTTServerIp":"mQTTServerIp"
,"ftpServerPwd":"ftpServerPwd","ftpServerUser":"ftpServerUser"
, "ftpServerIp":"ftpServerIp","numSerie" :"numSerie","idConcentrator":-1,"infoCameras":[]}

好像还好,不知道哪里错了。

我的 REST 服务是:

@RequestMapping(value = "/", method = RequestMethod.POST, consumes = { "application/json" }, produces = { "application/json" })
public ResponseEntity<String> post(@RequestBody ConfigurationConcentrator configurationConcentrator) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
try {
configureConcentrator.create(configurationConcentrator);
} catch (IncorrectDBOperation | ErrorSendMessageException e) {
return new ResponseEntity<String>(e.getMessage(), headers, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<String>(HttpStatus.CREATED);
}

此外,它还检查了 jackson 依赖项(数据绑定(bind)、核心和注释)并将它们添加到 .war 文件中。这是我的 curl 命令:

 curl -X POST -H "Content-Type: application/json" --data  @addConcentrator2.json http://x.x.x.x:8080/app-1.0-SNAPSHOT/v1.0/concentrators/

看起来,它无法正确解析哪个拦截器需要,但我没有看到问题:

    @RequestMapping(value = "/{id}", method = RequestMethod.GET, consumes = { "application/json" }, produces = { "application/json" })
public @ResponseBody ResponseEntity<ConfigurationConcentrator> get(@PathVariable("id") String id) {
....
}

@RequestMapping(value = "/", method = RequestMethod.POST, consumes = { "application/json" }, produces = { "application/json" })
public ResponseEntity<String> post(@RequestBody ConfigurationConcentrator configurationConcentrator) {
....

}

@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = { "application/json" }, produces = { "application/json" })
public ResponseEntity<String> put(@PathVariable("id") String id, @RequestBody ConfigurationConcentrator configurationConcentrator) {
....

}

@RequestMapping(value = "/{id}/cameras/{idcamera}", method = RequestMethod.PUT, consumes = { "application/json" }, produces = { "application/json" })
public ResponseEntity<String> putCameras(@PathVariable("id") String id, @PathVariable("idcamera") String idCamera,
....

}

@RequestMapping(value = "/{id}/cameras", method = RequestMethod.POST, consumes = { "application/json" }, produces = { "application/json" })
public ResponseEntity<String> postCameras(@PathVariable("id") String id, @RequestBody List<ConfigurationCamera> configurationCameras) {
....
}

@RequestMapping(value = "/{id}/initialconfiguration", method = RequestMethod.GET, consumes = { "application/json" }, produces = { "application/json" })
public ResponseEntity<StatusInitialConfiguration> getInitialConfiguration(@PathVariable("id") String numSerie) {
....


}

更新 1:我用 Accept header 更新了 curl 命令。

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" --data  @addConcentrator2.json http://x.x.x.x:8080/app-1.0-SNAPSHOT/v1.0/concentrators/

更新 2:我认为,它正在检测两个拦截器:

06:36:41.011 [http-nio-8080-exec-8] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapping [/v1.0/concentrators/1/camera
s] to HandlerExecutionChain with handler [gasnatural.ConcentratorController@74e5ead6] and 2 interceptors
06:36:41.011 [http-nio-8080-exec-8] DEBUG org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - Resolving exception from han
dler [gasnatural.ConcentratorController@74e5ead6]: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported
06:36:41.011 [http-nio-8080-exec-8] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [gas
natural.ConcentratorController@74e5ead6]: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported
06:36:41.011 [http-nio-8080-exec-8] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [gasnat
ural.ConcentratorController@74e5ead6]: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported
06:36:41.011 [http-nio-8080-exec-8] DEBUG org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'dispatc
her': assuming HandlerAdapter completed request handling
06:36:41.011 [http-nio-8080-exec-8] DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request

更新3:

映射 JSON 的类:

配置集中器

package gasnatural.models;

import java.util.ArrayList;
import java.util.List;

public class ConfigurationConcentrator {
public static class InfoCamera {
public Long idCamera;
public String numSerie;
}

private String street = null;
private String num = null;
private String code = null;
private String town = null;

private String descriptionRoom = null;

private String btPwd = null;
private String gprsPwd = null;
private String gprsLogin = null;
private String gprsApn = null;
private String gprsPin = null;
private String motherboardId = null;
private int logLevel = -1;
private int frameSendPeriod = -1;
private int frameCapturePeriod = -1;
private String mQTTServerPwd = null;
private String mQTTServerUser = null;
private String mQTTServerIp = null;
private String ftpServerPwd = null;
private String ftpServerUser = null;
private String ftpServerIp = null;
private String numSerie = null;

private Long idConcentrator;
private List<InfoCamera> infoCameras;

public ConfigurationConcentrator() {

}

public ConfigurationConcentrator(String street, String num, String town, String code, String descriptionRoom, String btPwd, String gprsPwd,
String gprsLogin, String gprsApn, String gprsPin, String motherboardId, int logLevel, int frameSendPeriod, int frameCapturePeriod,
String mQTTServerPwd, String mQTTServerUser, String mQTTServerIp, String ftpServerPwd, String ftpServerUser, String ftpServerIp, String numSerie) {

this(new Long(-1), street, num, town, code, descriptionRoom, btPwd, gprsPwd, gprsLogin, gprsApn, gprsPin, motherboardId, logLevel, frameSendPeriod,
frameCapturePeriod, mQTTServerPwd, mQTTServerUser, mQTTServerIp, ftpServerPwd, ftpServerUser, ftpServerIp, numSerie,
new ArrayList<InfoCamera>());
}

public ConfigurationConcentrator(Long idConcentrator, String street, String num, String town, String code, String descriptionRoom, String btPwd,
String gprsPwd, String gprsLogin, String gprsApn, String gprsPin, String motherboardId, int logLevel, int frameSendPeriod, int frameCapturePeriod,
String mQTTServerPwd, String mQTTServerUser, String mQTTServerIp, String ftpServerPwd, String ftpServerUser, String ftpServerIp, String numSerie,
List<InfoCamera> infoCameras) {

this.descriptionRoom = descriptionRoom;
this.btPwd = btPwd;
this.gprsPwd = gprsPwd;
this.gprsLogin = gprsLogin;
this.gprsApn = gprsApn;
this.gprsPin = gprsPin;
this.motherboardId = motherboardId;
this.logLevel = logLevel;
this.frameSendPeriod = frameSendPeriod;
this.frameCapturePeriod = frameCapturePeriod;
this.mQTTServerPwd = mQTTServerPwd;
this.mQTTServerUser = mQTTServerUser;
this.mQTTServerIp = mQTTServerIp;
this.ftpServerPwd = ftpServerPwd;
this.ftpServerUser = ftpServerUser;
this.ftpServerIp = ftpServerIp;
this.numSerie = numSerie;

this.street = street;
this.num = num;
this.code = code;
this.town = town;

this.descriptionRoom = descriptionRoom;
this.infoCameras = infoCameras;
this.idConcentrator = idConcentrator;
}

public void addIdCamera(InfoCamera idCamera) {
this.infoCameras.add(idCamera);
}

public String getStreet() {
return street;
}

public String getNum() {
return num;
}

public String getCode() {
return code;
}

public String getTown() {
return town;
}

public String getDescriptionRoom() {
return descriptionRoom;
}

public String getBtPwd() {
return btPwd;
}

public String getGprsPwd() {
return gprsPwd;
}

public String getGprsLogin() {
return gprsLogin;
}

public String getGprsApn() {
return gprsApn;
}

public String getGprsPin() {
return gprsPin;
}

public String getMotherboardId() {
return motherboardId;
}

public int getLogLevel() {
return logLevel;
}

public int getFrameSendPeriod() {
return frameSendPeriod;
}

public int getFrameCapturePeriod() {
return frameCapturePeriod;
}

public String getmQTTServerPwd() {
return mQTTServerPwd;
}

public String getmQTTServerUser() {
return mQTTServerUser;
}

public String getmQTTServerIp() {
return mQTTServerIp;
}

public String getFtpServerPwd() {
return ftpServerPwd;
}

public String getFtpServerUser() {
return ftpServerUser;
}

public String getFtpServerIp() {
return ftpServerIp;
}

public String getNumSerie() {
return numSerie;
}

public Long getIdConcentrator() {
return idConcentrator;
}

public List<InfoCamera> getInfoCameras() {
return infoCameras;
}

public void setStreet(String street) {
this.street = street;
}

public void setNum(String num) {
this.num = num;
}

public void setCode(String code) {
this.code = code;
}

public void setTown(String town) {
this.town = town;
}

public void setDescriptionRoom(String descriptionRoom) {
this.descriptionRoom = descriptionRoom;
}

public void setBtPwd(String btPwd) {
this.btPwd = btPwd;
}

public void setGprsPwd(String gprsPwd) {
this.gprsPwd = gprsPwd;
}

public void setGprsLogin(String gprsLogin) {
this.gprsLogin = gprsLogin;
}

public void setGprsApn(String gprsApn) {
this.gprsApn = gprsApn;
}

public void setGprsPin(String gprsPin) {
this.gprsPin = gprsPin;
}

public void setMotherboardId(String motherboardId) {
this.motherboardId = motherboardId;
}

public void setLogLevel(int logLevel) {
this.logLevel = logLevel;
}

public void setFrameSendPeriod(int frameSendPeriod) {
this.frameSendPeriod = frameSendPeriod;
}

public void setFrameCapturePeriod(int frameCapturePeriod) {
this.frameCapturePeriod = frameCapturePeriod;
}

public void setmQTTServerPwd(String mQTTServerPwd) {
this.mQTTServerPwd = mQTTServerPwd;
}

public void setmQTTServerUser(String mQTTServerUser) {
this.mQTTServerUser = mQTTServerUser;
}

public void setmQTTServerIp(String mQTTServerIp) {
this.mQTTServerIp = mQTTServerIp;
}

public void setFtpServerPwd(String ftpServerPwd) {
this.ftpServerPwd = ftpServerPwd;
}

public void setFtpServerUser(String ftpServerUser) {
this.ftpServerUser = ftpServerUser;
}

public void setFtpServerIp(String ftpServerIp) {
this.ftpServerIp = ftpServerIp;
}

public void setNumSerie(String numSerie) {
this.numSerie = numSerie;
}

public void setIdConcentrator(Long idConcentrator) {
this.idConcentrator = idConcentrator;
}

public void setInfoCameras(List<InfoCamera> infoCameras) {
this.infoCameras = infoCameras;
}

}

配置相机

package gasnatural.models;

public class ConfigurationCamera {
private String numSerie = null;
private String numCamera = null;
private String cups = null;

private String status = null;

public ConfigurationCamera() {

}

public ConfigurationCamera(String numSerie, String numCamera, String cups, String status) {
this.numSerie = numSerie;
this.numCamera = numCamera;
this.cups = cups;
this.status = status;
}

public String getStatus() {
return status;
}

public String getNumSerie() {
return numSerie;
}

public String getNumCamera() {
return numCamera;
}

public String getCups() {
return cups;
}

public void setNumSerie(String numSerie) {
this.numSerie = numSerie;
}

public void setNumCamera(String numCamera) {
this.numCamera = numCamera;
}

public void setCups(String cups) {
this.cups = cups;
}

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

}

UPDATE4

我简化了映射对象类,但我收到了同样的错误。

public class DTOConfigurationConcentrator {
private String street;
private String num;

public DTOConfigurationConcentrator() {
super();
}

public String getStreet() {
return street;
}

public void setStreet(String street) {
this.street = street;
}

public String getNum() {
return num;
}

public void setNum(String num) {
this.num = num;
}

}

似乎与 json 序列化工具有关,但我不知道如何检查它。

最佳答案

我忘记用 @EnableWebMvc 标记我的配置类...

关于java - Spring 4,REST 服务从 Tomcat 返回 415 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com