Я хочу десериализовать (привязать) JSON к java-объекту. Как это сделать в Struts2?
Я пытаюсь сделать это с помощью struts2-json-plugin, как вы можете видеть в коде ниже, но отправленный JSON из frontend не привязан к моему java-объекту. Не могли бы вы мне помочь, пожалуйста, как правильно работать с этим кодом?
Пожалуйста, взгляните на мой класс Action, я не уверен, правильно ли я обрабатываю JSON в этом действии, или, может быть, я что-то пропустил?
JSON, который я пытаюсь связать:
{"data":[
{"active":true,"color":"orange","date":"2008-01-01","id":1,"name":"Chris"},
{"active":false,"color":"blue","date":"2013-03-03","id":2,"name":"Kate"},
{"active":true,"color":"black","date":"2013-05-03","id":3,"name":"Blade"},
{"active":false,"color":"yellow","date":"2013-01-01","id":4,"name":"Zack"}]
}
Отправка JSON с помощью Ajax:
$.ajax({
url: "../json/saveJSONDataAction.action",
data: {"data": handsontable.getData()}, //returns all cells' data
dataType: 'json',
type: 'POST',
success: function (res) {
if (res.result === 'ok') {
$console.text('Data saved');
}
}
});
Получение JSON в Struts2:
Я могу выполнить метод execute() в отладке, но, к сожалению, поле data
всегда равно null. Что я должен сделать, чтобы заполнить это поле данными из JSON? Является ли JSON в правильном формате для привязки к List<Report> data
?
@ParentPackage("json-default")
@Action(value="saveJSONDataAction")
@Result(type="json")
public class JSONSaveAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<Report> data;
public JSONSaveAction(){
}
public String execute() {
try {
System.out.println(data);
} catch (Exception e) {
e.printStackTrace();
}
return NONE;
}
public List<Report> getData() {
return data;
}
public void setData(List<Report> data) {
this.data = data;
}
}
Класс отчета
public class Report {
private int id;
private String name;
private boolean active;
private String date;
private String color;
//getters and setters
}
struts.xml:
Как вы можете видеть здесь, я добавил <interceptor-ref name="json">
с <param name="enableSMD">true</param>
. Целая конфигурация ниже:
<struts>
<constant name="struts.action.extension" value="action,pdf" />
<constant name="struts.i18n.reload" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.custom.i18n.resources" value="i18n/ap,application" />
<constant name="struts.date.format" value="yyyy-MM-dd" />
<constant name="struts.serve.static" value="true" />
<constant name="struts.serve.static.browserCache" value="false" />
<package name="default" namespace="/ftl" extends="json-default">
<result-types>
<result-type name="rethrowException" class="com.myhome.commons.util.ExceptionRethrowResult" />
<result-type name="poi-excel" class="com.myhome.commons.util.PoiExcelResult"/>
</result-types>
<interceptors>
<interceptor name="businessException" class="com.myhome.commons.exception.BusinessExceptionInterceptor"></interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="i18n" />
<interceptor-ref name="chain" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload">
<param name="maximumSize">10485760</param>
</interceptor-ref>
<interceptor-ref name="checkbox" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
<interceptor-ref name="prepare" />
<interceptor-ref name="conversionError" />
<interceptor-ref name="businessException" />
<interceptor-ref name="validation">
<param name="includeMethods">save,search</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="includeMethods">save,search</param>
</interceptor-ref>
<interceptor-ref name="tokenSession">
<param name="includeMethods">save</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
<global-results>
<result name="exception" type="chain">
<param name="actionName">exception</param>
<param name="namespace">/</param>
</result>
<result name="rethrowException">/applicationAccessDeniedPage.jsp</result>
<result name="applicationAccessDenied">/applicationAccessDeniedPage.jsp</result>
<result name="unavailableResource">/unavailableResource.jsp</result>
<result name="pessimisticLock">/pessimisticLock.jsp</result>
<result name="goto-crud" type="redirect">/crud/index.action</result>
<result name="goto-dict" type="redirect">/dictionaries/index.action</result>
<result name="reportXls" type="poi-excel">
<param name="contentDisposition">attachment; filename="${resultFileName}"</param>
<param name="excelWorkbook">workbook</param>
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="com.myhome.ap.service.exception.AuthorizationFailedException" result="rethrowException"/>
<exception-mapping exception="com.myhome.ap.service.exception.ApplicationAccessDeniedException" result="applicationAccessDenied"/>
<exception-mapping exception="org.hibernate.ObjectNotFoundException" result="unavailableResource" />
<exception-mapping exception="com.myhome.ap.service.exception.model.EntityHasBeenDeletedException" result="unavailableResource" />
<exception-mapping exception="com.myhome.ap.service.exception.PessimisticLockingException" result="pessimisticLock" />
<exception-mapping exception="java.lang.Exception" result="exception"/>
</global-exception-mappings>
<action name="version" class="com.myhome.ap.web.action.VersionAction" />
</package>
</struts>
Что я делаю неправильно? Можете ли вы предложить мне несколько хороших примеров/учебников, как сделать десериализацию с JSON на Java в Struts2, потому что я не могу найти даже один правильный полный пример с десериализацией JSON в Struts2, особенно пример кода действия, который получит JSON и привяжет его к Java,
Я новичок в Struts, поэтому у меня возникают проблемы, чтобы понять некоторые проблемы и потоки, например, как получать и обрабатывать JSON в действии. Есть примеры для сериализации с помощью struts2-json-plugin, но с этим вопросом у меня не было проблем. Пожалуйста, помогите мне...