2015-05-16 2 views
0

У меня проблема с моим MVC-сервером. Когда я после моего JSON:SPRING MVC не может получить параметры от json

{ 
    "shipName":"shfdsfds", 
    "signal":"fdsfsd321", 
    "longitude":43, 
    "latitude":32, 
    "maxSpeed":342 
} 

с использованием методы PUT и в классе сигналов два конструктора определяются:

public Signal(){ 
} 

public Signal(String shipName, String signal, int latitude, int longitude, 
     int maxSpeed) { 
    ShipName = shipName; 
    Signal = signal; 
    Latitude = latitude; 
    Longitude = longitude; 
    MaxSpeed = maxSpeed; 
} 

каждый раз я получаю код Статуса: 200-Ok, но неправильное значение колясок (addSignal: 0).

Мой контроллер:

@RequestMapping(value = "/addSignal", method = RequestMethod.PUT) 
@ModelAttribute 
public ResponseEntity<Signal> add(
     @ModelAttribute Signal signal) throws SQLException, 
     ClassNotFoundException { 
    System.out.println("addSignal: "+signal.getMaxSpeed()); 
    return new ResponseEntity<Signal>(signal, HttpStatus.OK); 

} 

При попытке удалить первый конструктор (публичный сигнал() {}), я получаю ошибку: Код состояния: 500 Внутренняя ошибка сервера

консоли:

maj 16, 2015 3:18:23 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [server] in context with path [/shipserver] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.mkozykowski.api.Signal]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.mkozykowski.api.Signal.<init>()] with root cause 
java.lang.NoSuchMethodException: com.mkozykowski.api.Signal.<init>() 
    at java.lang.Class.getConstructor0(Class.java:2892) 
    at java.lang.Class.getDeclaredConstructor(Class.java:2058) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:101) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:746) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:687) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915) 
    at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:833) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:651) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

--------- --------- редактировать Я изменил мой контроллер:

@RequestMapping(value = "/addSignal", method = RequestMethod.PUT, produces = "application/json") 
public ResponseEntity<Signal> add(
     @RequestBody Signal signal) throws SQLException, 
     ClassNotFoundException { 
    System.out.println("addSignal: "+signal.getMaxSpeed()); 
    return new ResponseEntity<Signal>(signal, HttpStatus.OK); 
} 

В классе Signal теперь у меня есть один конструктор:

public Signal(@JsonProperty("shipName")String shipName,@JsonProperty("signal")String signal, 
      @JsonProperty("latitude")int latitude, @JsonProperty("longitude")int longitude, 
      @JsonProperty("maxSpeed")int maxSpeed) { 
     ShipName = shipName; 
     Signal = signal; 
     Latitude = latitude; 
     Longitude = longitude; 
     MaxSpeed = maxSpeed; 
    } 

Отправка JSon по RESTClient добавить заголовок: Content-Type: приложения/JSON. Сейчас я получаю сообщение об ошибке:

HTTP Status 415

В моей консоли ничего не появляется.

+0

Вы не используете привязку (параметры запроса привязаны к параметрам объекта). Вы хотите маршалинг. Вместо '@ ModelAttribtue' (который используется для привязки) используйте' @ RequestBody' для преобразования тела в объект. Также вы, вероятно, хотите, чтобы '@ ModelAttribute' в вашем методе был' @ ResponseBody', чтобы вернуть JSON клиенту вместо объекта. –

ответ

1

Мне кажется, что вы должны использовать @RequestBody вместо @ModelAttribute. И чтобы быть уверенным, что json deserializer правильно построит ваш класс с использованием json-данных, я предлагаю параметры аннотирования конструктора с помощью @JsonProperty("propertyName"), где propertyName соответствует имени json.

--- редактировать ---

Вы уверены, что вы правильно установить заголовок? Потому что ваш код отлично работает для меня.

+0

Да, я уверен. Вот фотография из Postman: http: //postimg.org/image/sxso38v51/ –

+0

Когда я раскомментирую свой первый конструктор (public Signal() {}), все работает нормально. Weird ... –

+0

Я вижу. Таким образом, ваши данные кодируются как «данные формы», вам нужно отправить json (вы можете написать json-код на вкладке «raw» с почтовым комментарием). –