Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 请求参数正在覆盖我的未发布的独立bean';s场_Java_Spring - Fatal编程技术网

Java 请求参数正在覆盖我的未发布的独立bean';s场

Java 请求参数正在覆盖我的未发布的独立bean';s场,java,spring,Java,Spring,有一个疯狂的副作用,由于我的一些代码组合。我有一个叫做钱包的bean,它有一个地址,我有一个getter和setter用于该字段 我在jsp中有一个视图,它接受地址a和数量n的输入。重点是向a发送n个虚拟硬币 以下是提交后的URL:http://localhost:8080/CaseStudy/wallet/transact?address=foo&amount=45&submit=Submit 我还有一个Transaction类,它提供了一个创建事务的方法,该事务将发件人钱包和地址a作为字符串

有一个疯狂的副作用,由于我的一些代码组合。我有一个叫做钱包的bean,它有一个地址,我有一个getter和setter用于该字段

我在jsp中有一个视图,它接受地址a和数量n的输入。重点是向a发送n个虚拟硬币

以下是提交后的URL:
http://localhost:8080/CaseStudy/wallet/transact?address=foo&amount=45&submit=Submit

我还有一个Transaction类,它提供了一个创建事务的方法,该事务将发件人钱包和地址a作为字符串,金额n作为双精度

我通过阅读上面的请求参数来调用它

@GetMapping("/wallet/transaction")
public String postTransaction(@ModelAttribute("wallet") Wallet w, Model model,
        @RequestParam("address") String address, @RequestParam("amount") double amount, HttpServletRequest request)
        throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, IOException {
    Transaction t1 = new Transaction(w, address, amount);
    model.addAttribute("transaction", t1);
    return "transaction"; // a jsp page
为了充分披露,这里是我的事务构造函数方法。我不认为我需要给你完整的代码,因为我只是问这是怎么发生的,这是怎么可能的

公开交易(钱包发送者Wallet,字符串recipientAddress,双倍金额)
抛出NoSuchAlgorithmException、NoSuchProviderException、InvalidKeyException、IOException{
超级();
this.uuid=StringUtils.getUUID8();
试一试{
this.output=Transaction.createOutput(senderWallet、recipientAddress、amount);
}捕获(交易量超过平衡e){
e、 printStackTrace();
System.out.println(“未创建新事务,请参阅上面的堆栈跟踪”);
System.out.println(“返回主程序”);
返回;
}
试一试{
this.input=Transaction.createInput(senderWallet,this.output);
}捕获(签名例外e){
e、 printStackTrace();
}
this.senderWallet=senderWallet;
this.recipientAddress=收件人地址;
这个。金额=金额;
System.out.println(“创建的有效新交易”);
}
它调用一些输入和输出生成函数。这只是为了制作简单的字典,这些字典将被序列化并通过网络发送

现在钱包地址永远不会改变。我希望请求参数中发送的地址为收件人地址。我想我可以把它改成“?recipientAddress=”来解决这个问题

然而,我有一些错误,我可以

如果我把13发到保罗的地址,这就是我所期望的

{“output”:{“paul”:13.0,“fd4d4e3e”:987.0},“amount”:13.0,“address”:“paul”,“publicKey”:“TODO”,“UUID”:“e01e4786”,“publicKeyInfo”:“TODO”}

输出字典应该有两个字段,收件人地址和发送金额,以及我或发件人地址和我以前余额的剩余部分

但这就是我真正得到的

{“输出”:{“pauladdr”:987.0},“金额”:13.0,“地址”:“pauladdr”,“公钥”:“TODO”,“UUID”:“2b1a15d3”,“公钥信息”:“TODO”}

同样在日志中,它似乎用请求参数覆盖了钱包地址

当我删除setter方法时,它在钱包中修复了它。我想我也可以通过将请求参数更改为“recipientaddress”来修复它,然后我可以保留setter,尽管我不需要setter

我只是想分析和了解发生了什么。这没有任何意义,但话说回来,框架和控制反转应用程序是自上而下工作的。他们对bean或类有最终的控制权,对吗?任何时候你有一个二传手,你给他们一个钩子。那么问题是“为什么”。为什么仅仅因为它共享了一个名称就要覆盖依赖类的字段?Transaction接收钱包作为参数,并根据作为ModelAttribute创建的钱包构造新的事务

@modeldattribute(“钱包”)
公共钱包addWallet()
抛出NoSuchAlgorithmException、NoSuchProviderException、InvalidAlgorithmParameterException{
Wallet Wallet=Wallet.createWallet();
归还钱包;
}
用一个随机地址。它必须看到有一个地址的requestParam,并且它必须假设我想要设置钱包的地址,即使我直接传递与签名一致的值

公共字符串postTransaction(@ModelAttribute(“钱包”)钱包w,型号,
@RequestParam(“地址”)字符串地址,@RequestParam(“金额”)双倍金额,HttpServletRequest){
引发InvalidKeyException、NoSuchAlgorithmException、NoSuchProviderException、IOException{
交易t1=新交易(w、地址、金额);
}
它必须获取参数并用address重置w wallet的值。如果我有一个完全不同的对象作为第四个参数,它也有一个地址设置器,会不会改变呢

我知道依赖注入对于实现解耦非常有效。我只是想更好地理解这一切是如何工作的。我在使用框架时经常遇到麻烦和困惑,因为我的思维是逻辑地、一步一步地工作的。在使用框架时,你必须理解你无法看到的东西,从上到下,从w当应用程序初始化到您编写的代码行时。根据Spring MVC的逻辑,我无意中告诉它更改Wallet的地址?但是,即使它调用了`` Wallet.setAddress``并且我删除了它,它也没有使代码崩溃

当我开始学习编码时,我并不期望这样的框架存在。我期望机器逻辑、构建库等方面会有更多的框架,但它们是好的和重要的,我现在明白了原因。如果做得不好,库导入实际上可能是反模式的。框架有点像应用程序中的操作系统,不是吗他们不是吗?在某种程度上,你把控制权交给他们,并使用他们的api和结构。如果你按照他们的规则行事,你不会真的失去任何控制权,但他们在技术上仍然拥有控制权,因为控制权的反转