spring使用request参数来使用@modelAttribute批注初始化请求模型域对象

时间:2014-04-10 12:52:22

标签: spring-mvc

我在方法参数中传递的请求参数得到org.springframework.beans.NotWritablePropertyException。即使在此异常之后一切正常。这是在DynaTrace控制台上进行性能测试时捕获的。这是我的控制器方法: -

@RequestMapping(value = UrlConstants.ES_UPDATE_APPLICABLE_ITEM, method = RequestMethod.POST)
public void updateApplicableItem(@ModelAttribute("sessionDto") final SessionDTO sessionDto,
        @RequestParam(value = GdrConstants.REWARD_ID) final Long rewardId,
        @RequestParam(value = GdrConstants.APPL_ITEM_ID) final Long itemId,
        @RequestParam(value = GdrConstants.COLUMN_NAME) final String columnName,
        @RequestParam(value = GdrConstants.COLUMN_VALUE) final String columnValue,
        final HttpServletRequest request, final HttpServletResponse response, final Model model) {

}

sessionDto是使用@ModelAttribute与html表单绑定的Domain对象。在Dynatrace会话中,我可以看到以下异常: -

Invalid property 'itemId' of bean class [com.cisco.gdr.dto.SessionDTO]: 
    Bean property 'itemId' is not writable or has an invalid setter method. Does the
    parameter type of the setter match the return type of the getter?

其他请求参数也抛出相同的异常,即rewardId,ItemId,coulnName和columnValue。

  1. 这是否意味着spring使用request参数初始化sessionDto对象并且需要所有输入参数的setter方法,即使这些参数与域对象无关?
  2. 我们还需要吸气器吗?
  3. 如果是,那么我们如何防止这种情况以及其他更好的方法。我不希望在初始化中使用这些参数。

    请注意,UI仍然正常加载,仅在Dynatrace工具中捕获并且需要修复。

    * *添加SessionDTO *

    // @Component(value =" sessionDto") // @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value = WebApplicationContext.SCOPE_SESSION) 公共课SessionDTO {

    private final Map<String, Object> attributes = new HashMap<String, Object>();
    
    /**
     * Adds the given attribute key and value to the session DTO. If the given attribute key already exists, it will be
     * overridden with the new value.
     * 
     * @param key
     * @param value
     */
    public void addAttribute(final String key, final Object value) {
        this.attributes.put(key, value);
    }
    
    /**
     * Removes the given attribute key and its value from the session DTO.
     * 
     * @param key
     */
    public void removeAttribute(final String key) {
        this.attributes.remove(key);
    }
    
    /**
     * Returns the attribute for the given key.
     * 
     * @param key
     * @return
     */
    public Object getAttribute(final String key) {
        return this.attributes.get(key);
    }
    
    /**
     * Returns all the attributes added in the session DTO.
     * 
     * @return
     */
    public Map<String, Object> getAttributes() {
        return this.attributes;
    }
    

    }

    @DirkLachowski, 嗨Dirk,我已经编辑了post在其中添加sessionDTO。我没有在这里使用表单发布。我正在对这个控制器方法进行ajax调用.SeesionDto不是表单对象,它的@ modelSessionAttribute.I我只是从这里提取一些信息这在业务逻辑中是必需的。我怀疑使用@ModelAttribute作为请求参数而没有表单绑定会产生问题。 谢谢你-Junaid

0 个答案:

没有答案