@PathVariable 和 @ModelAttribute 的值重叠

2023-11-26

我有一个User存储在会话中的对象@SessionAttributes。以及一个直接的方法装饰@ModelAttribute以便在会话值为空时初始化它。

用户类别:

@Entity
@Table( name="USER")
public class User implements java.io.Serializable {

    private Long id;
    private String username;
    private String password;
    ....

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    ...

控制器:

@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {

@ModelAttribute方法:

@ModelAttribute("user")
    public User createUser(Principal principal) {
        return userService.findByUsername(principal.getName());
    }

除了这个特定的方法之外,一切似乎都按预期工作:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
            Model uiModel) {
   ...    
}

问题是User.id正在设置@PathVariable("id")。我相信我遇到了这个@RequestParam也。我假设这是因为两者具有相同的名称和类型。看完之后Spring 的文档(见下文)我假设这是预期的行为:

下一步是数据绑定。 WebDataBinder 类匹配请求参数名称(包括查询字符串参数和表单字段)以按名称对属性字段进行建模。在必要时应用类型转换(从字符串到目标字段类型)后,将填充匹配字段。

但是,我认为这种情况相当普遍,其他人如何处理这种情况?如果我的发现是正确的并且这是预期的行为(或错误),那么这似乎很容易出错。

可能的解决方案:

  1. Change @PathVariable("id") to @PathVariable("somethingElse")。有效,但使用 @RequestParam 并不那么简单(例如,我不知道如何将 jqgrid 的请求参数 id 更改为其他内容,但这是另一个问题)。
  2. Change @PathVariable("id")类型从 Long 到 Int。这将使User.id and id类型不同,但转换为 Long 看起来很丑:)
  3. 不要使用@ModelAttribute在这里并查询数据库User再次。与其他方法不一致并且涉及冗余的数据库调用。

有什么建议么?


这种方法怎么样——

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id,
            Model uiModel) {
       User user = (User)uiModel.asMap().get("user");
   ...    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@PathVariable 和 @ModelAttribute 的值重叠 的相关文章

随机推荐

  • Linux/Qt/C++下如何检测USB设备断开

    我正在编写一个系统 X Platform Windows Linux 该系统使用 FTDI USB 芯片与自定义设备进行通信 我使用他们的 D2XX 驱动程序进行设备打开 关闭 读 写 到目前为止 一切都很好 我需要知道设备何时断开连接 以
  • 如何将 C# 代码编译为库而不是可执行文件?

    我在 Visual Studio 2010 中有一个 C 控制台应用程序 它有一个 Main 方法以及一堆实用程序类 我希望这些实用程序类可用于其他解决方案 从网上阅读看来我需要将其编译为类库 DLL 这就是我所做的 进入 Visual S
  • Laravel JSON 响应不带反斜杠

    我正在使用 AJAX 将数据发送到我的控制器 PHP代码 return response gt json request gt root summer uploads store 它返回 http domain test summer up
  • 为什么我无法使用 JQuery .html 添加

    为什么这段代码有效 div error container html div class error No more foo allowed div 但这段代码会导致错误 div error container html div class
  • Log4j2:SMTPAppender 不发送错误或致命级别的邮件

    我发现 log4j2 中的 SMTPAppender 有一些问题 每当记录具有以下级别的事件时error or fatal被创建without举办具有级别的活动info在没有邮件发送并且致命事件消失之前 这是我的 log4j2 配置文件 l
  • 如何将这些 SQL SELECT 查询合并到一个 SELECT 语句中

    如何将这两个 select 语句合并到一个查询中 SELECT SUM incidents AS fires neighborhoods AS fire neighborhoods FROM SELECT FROM fires 2009 i
  • `RefCell` 无法在线程之间安全共享?

    这是一个延续如何在 Rust 的闭包内重用外部作用域的值 为了更好的呈现 开通了新的Q main rs The value will be modified eventually inside main and a http request
  • CSS 响应式左浮动和右浮动(更改哪个 div 位于顶部)?

    我正在这个页面上工作 http www insidemarketblog com test 4 您会看到单词 test 位于左侧浮动的 div 中 图像位于右侧浮动的 div 中 如果调整它的大小 您会看到左浮动的 div 位于顶部 右浮动
  • 打开一个新的弹出窗口并向其发布数据

    我正在使用 jQuery 打开一个弹出窗口 我想在它打开时使用 post 方法向其发送数据 任何人都可以帮助我 提前致谢 我目前正在使用 get 方法传递数据 因此数据是 url 中的一部分 但我不希望数据在 url 中可见 functio
  • 在哪里可以找到 TensorFlow 2.0 的tensorflow.contrib.layers

    我一直在 TensorFlow 中开发机器学习代码contrib layers 我对这个模块很满意 它工作得很好 让我能够充分控制我的模型 然而 TensorFlow 2 0将完全删除contrib模块和新的keras模块在没有额外努力的情
  • 以编程方式获取页面的屏幕截图

    我正在编写一个供内部使用的专用爬虫和解析器 并且我需要能够截取网页的屏幕截图 以便检查整个过程中使用的颜色 该程序将接收大约十个网址并将它们保存为位图图像 从那里我计划使用 LockBits 来创建图像中最常用的五种颜色的列表 据我所知 这
  • 使用分页查看目录中的文件 - php

    我想在浏览器中显示我的目录中的文件 我知道这可以使用 opendir and readdir 但我想要的是将列表中的文件数量限制为特定数量并使用分页显示下一个 你可以使用scandir将目录的所有内容读入数组 然后根据分页值输出数组的内容
  • isInstance 和 isInstanceOf 之间的区别

    之间有区别吗classOf String isInstance 42 and 42 isInstanceOf String 如果是 你能解释一下吗 对于引用类型 那些扩展AnyRef 最终结果没有区别 isInstanceOf然而 我们非常
  • KafkaStreams:获取窗口最终结果

    是否可以得到窗口最终结果在 Kafka Streams 中通过抑制中间结果 我无法实现这个目标 我的代码有什么问题吗 val builder StreamsBuilder builder stream
  • 导入 CSV 文件时如何删除文本周围的双引号?

    我有类似于以下内容的数据 D STEIN DS 01 ALTRES TTTTTTFFTT D STEIN DS 01 APCASH TTTTTTFFTT D STEIN DS 01 APINH TTTTTTFFTT D STEIN DS 0
  • 使用 java nio 路径时未安装 JBoss wildfly 8.x 提供程序“vfs”

    我正在尝试将 spring 应用程序从 glassfish 4 导出到 JBoss wildfly 8 x 或 9 alpha 但是当我的应用程序在代码的某些部分启动时会引发异常 Caused by java lang RuntimeExc
  • e.srcElement 在 Firefox 中未定义?

    我正在开发一个网站 现在正在所有浏览器中进行测试 我目前正在 firefox 中进行测试 并且在使用 event sourceElement 时发现错误 我需要 e srcElement 做的是返回值 下面我展示了一个关于如何获取返回的值
  • 关于太多开放数字的警告

    在我创建许多人物的脚本中fix ax plt subplots 我收到警告运行时警告 已打开超过 20 个数字 通过 pyplot 接口创建的图形 matplotlib pyplot figure 会保留到显式关闭为止 并且可能会消耗太多内
  • 在 Web api 控制器中手动验证模型

    我有一个名为 用户 的类和一个属性 名称 public class User Required public string Name get set api控制器方法是 public IHttpActionResult PostUser U
  • @PathVariable 和 @ModelAttribute 的值重叠

    我有一个User存储在会话中的对象 SessionAttributes 以及一个直接的方法装饰 ModelAttribute以便在会话值为空时初始化它 用户类别 Entity Table name USER public class Use