我使用一个简单的POJO作为会话bean,并使用相同的POJO作为$ .ajax调用的json响应。
POJO
public class TransportPacket implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String fieldName , fieldValue, query, error, buttonName, formName, actionName;
private List<String> results = new ArrayList<String>();
private boolean redirect = false;
private Object[][] data;
private Map<String, String> mapOfFieldsWithValues;
private String[] fieldsToBeShown;
private List<String> extraFieldsChosen = new ArrayList<String>();
public String getFormName() {
return formName;
}
public void setFormName(String formName) {
this.formName = formName;
}
public String getActionName() {
return actionName;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
@JsonIgnore
public void initialize() {
fieldName = "";
fieldValue = "";
query = "";
error = "";
buttonName = "";
if(this.getMapOfFieldsWithValues() != null) {
this.getMapOfFieldsWithValues().clear();
}
this.getExtraFieldsChosen().clear();
this.fieldsToBeShown = null;
}
@JsonIgnore
public void clear() {
this.initialize();
}
public String getButtonName() {
return buttonName;
}
public void setButtonName(String buttonName) {
this.buttonName = buttonName;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldValue() {
return fieldValue;
}
public void setFieldValue(String fieldValue) {
this.fieldValue = fieldValue;
}
public List<String> getResults() {
return results;
}
public void setResults(List<String> results) {
this.results = results;
}
public boolean isRedirect() {
return redirect;
}
public void setRedirect(boolean redirect) {
this.redirect = redirect;
}
public Object[][] getData() {
return data;
}
public void setData(Object[][] data) {
this.data = data;
}
public Map<String, String> getMapOfFieldsWithValues() {
return mapOfFieldsWithValues;
}
public void setMapOfFieldsWithValues(Map<String, String> mapOfFieldsWithValues) {
this.mapOfFieldsWithValues = mapOfFieldsWithValues;
}
public String[] getFieldsToBeShown() {
return fieldsToBeShown;
}
public void setFieldsToBeShown(String[] fieldsToBeShown) {
if(this.fieldsToBeShown != null) {
List<String> existingFields = Arrays.asList(this.fieldsToBeShown);
this.getExtraFieldsChosen().clear();
for(String field : fieldsToBeShown) {
if(!existingFields.contains(field)) {
this.getExtraFieldsChosen().add(field);
}
}
} else {
this.getExtraFieldsChosen().addAll(Arrays.asList(fieldsToBeShown));
}
this.fieldsToBeShown = fieldsToBeShown;
}
public List<String> getExtraFieldsChosen() {
return extraFieldsChosen;
}
public void setExtraFieldsChosen(List<String> extraFieldsChosen) {
this.extraFieldsChosen = extraFieldsChosen;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在我的ApplicationContext.xml中,我添加了以下内容:
<bean id="packet" class="com.visa.vdps.dbmsrep.data.TransportPacket" scope="session">
<aop:scoped-proxy/>
</bean>
和
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
现在我在我的一个控制器中使用@Autowired自动装配bean。在同一个控制器中,我使用以下方法:
@RequestMapping(value="/SendFieldValueBack.htm", method=RequestMethod.POST)
public @ResponseBody TransportPacket validateField(HttpServletRequest request, HttpServletResponse response) {
String fieldName = request.getParameter("fieldName");
String fieldValue = request.getParameter("fieldValue");
// POJO
packet.setFieldName(fieldName);
packet.setFieldValue(fieldValue);
packet.setMapOfFieldsWithValues(this.mapOfFieldsWithValues);
this.addingActionPerformed(true);
request.getSession().setAttribute("packet", packet);
return this.getPacket();
}
从以下ajax方法调用此方法:
$(document).ready(
$.ajax({
url: "SendFieldValueBack.htm",
data: {"fieldName":fieldName, "fieldValue":fieldValue},
dataType: "json",
type: "POST",
cache: false,
success: function(data, textStatus, jQxhr){
alert("success");
evaluateDataFromController(data);
},
error: function(xhr, ajaxOptions, thrownError){
// code here
alert("Error from SendFieldValueBack.htm");
writeToConsole(thrownError);
}
}));
我收到错误提示“来自SendFieldValueBack.htm的错误”以及以下的堆栈跟踪:
13963 [http-bio-8080-exec-6] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - 无法编写HTTP消息:org.springframework.http.converter.HttpMessageNotWritableException:无法写入内容:找不到类org.springframework.context.expression.StandardBeanExpressionResolver的序列化程序,并且没有发现创建BeanSerializer的属性(为了避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链:com.visa.vdps.dbmsrep.data.TransportPacket $ $ $$ EnhancerBySpringCGLIB be504698 [ “TargetSource的”] - &GT; org.springframework.aop.target.SimpleBeanTargetSource [ “Bean工厂”] - &GT; org.springframework.beans.factory.support.DefaultListableBeanFactory [ “beanExpressionResolver”]);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:没有找到类org.springframework.context.expression.StandardBeanExpressionResolver的序列化器,也没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链: com.visa.vdps.dbmsrep.data.TransportPacket $$ EnhancerBySpringCGLIB $$ be504698 [ “TargetSource的”] - &GT; org.springframework.aop.target.SimpleBeanTargetSource [ “Bean工厂”] - &GT; org.springframework.beans.factory。 support.DefaultListableBeanFactory [ “beanExpressionResolver”]) 13963 [http-bio-8080-exec-6] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - 处理程序执行导致异常:无法写入内容:没有为类org.springframework.context.expression找到序列化程序.StandardBeanExpressionResolver并没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链:com.visa.vdps.dbmsrep.data.TransportPacket $$ EnhancerBySpringCGLIB $$ be504698 [“targetSource”] - &gt; org.springframework.aop.target.SimpleBeanTargetSource [ “Bean工厂”] - &GT; org.springframework.beans.factory.support.DefaultListableBeanFactory [ “beanExpressionResolver”]);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:没有找到类org.springframework.context.expression.StandardBeanExpressionResolver的序列化器,也没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链: com.visa.vdps.dbmsrep.data.TransportPacket $$ EnhancerBySpringCGLIB $$ be504698 [ “TargetSource的”] - &GT; org.springframework.aop.target.SimpleBeanTargetSource [ “Bean工厂”] - &GT; org.springframework.beans.factory。 support.DefaultListableBeanFactory [ “beanExpressionResolver”])
我正在使用Jackson2HttpMessageConverter。 有人可以帮助我吗?
提前致谢。
(我在这里第一次发帖。如果我没有以正确的方式做到这一点,请告诉我。)
答案 0 :(得分:0)
我知道已经有好几年了,但是我偶然发现了这个,因为我遇到了同样的问题。 Spring创建的TransportPacket
对象是一个代理,因此它上还有许多其他未定义的字段和方法。这里的一个好的策略是创建一个新的类,例如TransportPacketDTO
,并将属性从TransportPacket
转移到TransportPacketDTO
,这就是您从@RequestMapping
返回的内容方法。