无法写内容:没有找到类org.springframework.context.expression.StandardBeanExpressionResolver

时间:2015-11-10 14:08:54

标签: java spring-mvc jackson

我使用一个简单的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。 有人可以帮助我吗?

提前致谢。

(我在这里第一次发帖。如果我没有以正确的方式做到这一点,请告诉我。)

1 个答案:

答案 0 :(得分:0)

我知道已经有好几年了,但是我偶然发现了这个,因为我遇到了同样的问题。 Spring创建的TransportPacket对象是一个代理,因此它上还有许多其他未定义的字段和方法。这里的一个好的策略是创建一个新的类,例如TransportPacketDTO,并将属性从TransportPacket转移到TransportPacketDTO,这就是您从@RequestMapping返回的内容方法。