本文将分享将值'[Ljava.lang.String;@10dd65e')设置为表达式'spa.amount'时出错的详细内容,并且还将对将指定数据区的字符串数据以ascii码形式显示在屏幕上进行详尽
本文将分享将值'[Ljava.lang.String; @ 10dd65e')设置为表达式'spa.amount'时出错的详细内容,并且还将对将指定数据区的字符串数据以ascii码形式显示在屏幕上进行详尽解释,此外,我们还将为大家带来关于([Ljava/lang/String;)V的含义、com.sun.xml.bind.v2.model.nav.Navigator.isSameType(Ljava/lang/Object;Ljava/lang/Object;)Z、Eova 在 delete 时出现 java.lang.Integer cannot be cast to [Ljava.lang.Object;、Forge 1.12.2 Coremodding:java.lang.StringIndexOutOfBoundsException的相关知识,希望对你有所帮助。
本文目录一览:- 将值'[Ljava.lang.String; @ 10dd65e')设置为表达式'spa.amount'时出错(将指定数据区的字符串数据以ascii码形式显示在屏幕上)
- ([Ljava/lang/String;)V的含义
- com.sun.xml.bind.v2.model.nav.Navigator.isSameType(Ljava/lang/Object;Ljava/lang/Object;)Z
- Eova 在 delete 时出现 java.lang.Integer cannot be cast to [Ljava.lang.Object;
- Forge 1.12.2 Coremodding:java.lang.StringIndexOutOfBoundsException
将值'[Ljava.lang.String; @ 10dd65e')设置为表达式'spa.amount'时出错(将指定数据区的字符串数据以ascii码形式显示在屏幕上)
我正在尝试下面的代码来获取spa
对象字段中的数据。因此,我正在使用以下代码,但它显示了null
值并给出了以下错误
Error setting expression ''spa.amount'' with value ''[Ljava.lang.String;@10dd65e''ognl.OgnlException: target is null for setProperty(null, "amount", [Ljava.lang.String;@10dd65e)
Jsp代码:
<s:form action="UpdatedPaid" method="post"> <s:if test="paidList.size > 0"> <s:iterator value="paidList" var="pdlst"> <div> <span>Amount</span> <span> <s:hidden name="spa.id" id="paidId"> <s:param name="value"> <s:property value="paidId"/> </s:param> </s:hidden> <s:textfield name="spa.amount" id="amount"> <s:param name="value"> <s:property value="amount"/> </s:param> </s:textfield> </span> </div> <div> <span>Payment Date</span> <span> <s:textfield name="spa.paymentDate" id="paymentDate"> <s:param name="value"> <s:property value="paymentDate"/> </s:param> </s:textfield> </span> </div> <div> <span>Payment Mode</span> <span> <s:textfield name="spa.paymentMode" id="payment_mode" readonly="true"> <s:param name="value"> <s:property value="payment_mode"/> </s:param> </s:textfield> </span> </div> </s:iterator> </s:if> </s:form>
我的动作课
package iland.payment;import static com.opensymphony.xwork2.Action.SUCCESS;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import iland.hbm.SupplierPaidDetails;public class hbmCashAction extends ActionSupport implements ModelDriven<SupplierPaidDetails> { SupplierPaidDetails spa = new SupplierPaidDetails(); public SupplierPaidDetails getSpa() { return spa; } public void setSpa(SupplierPaidDetails spa) { this.spa = spa; } public String update() { System.out.println("--------"); System.out.println(spa.getId() + " " + spa.getPaymentMode() + " " + spa.getAmount()); System.out.println("--------"); return SUCCESS; } @Override public SupplierPaidDetails getModel() { return spa; }}
SupplierPayDetails
public class SupplierPaidDetails implements java.io.Serializable { private Long id; private SupplierPaymentDetails supplierPaymentDetails; private Float amount; private String paymentMode; private Date paymentDate; private Date addDate; private String status; private Set supplierPaidOnlines = new HashSet(0); private Set supplierPaidCashes = new HashSet(0); private Set supplierPaidChecks = new HashSet(0); public SupplierPaidDetails() { } public SupplierPaidDetails(SupplierPaymentDetails supplierPaymentDetails, Date addDate) { this.supplierPaymentDetails = supplierPaymentDetails; this.addDate = addDate; } public SupplierPaidDetails(SupplierPaymentDetails supplierPaymentDetails, Float amount, String paymentMode, Date paymentDate, Date addDate, String status, Set supplierPaidOnlines, Set supplierPaidCashes, Set supplierPaidChecks) { this.supplierPaymentDetails = supplierPaymentDetails; this.amount = amount; this.paymentMode = paymentMode; this.paymentDate = paymentDate; this.addDate = addDate; this.status = status; this.supplierPaidOnlines = supplierPaidOnlines; this.supplierPaidCashes = supplierPaidCashes; this.supplierPaidChecks = supplierPaidChecks; } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public SupplierPaymentDetails getSupplierPaymentDetails() { return this.supplierPaymentDetails; } public void setSupplierPaymentDetails(SupplierPaymentDetails supplierPaymentDetails) { this.supplierPaymentDetails = supplierPaymentDetails; } public Float getAmount() { return this.amount; } public void setAmount(Float amount) { this.amount = amount; } public String getPaymentMode() { return this.paymentMode; } public void setPaymentMode(String paymentMode) { this.paymentMode = paymentMode; } public Date getPaymentDate() { return this.paymentDate; } public void setPaymentDate(Date paymentDate) { this.paymentDate = paymentDate; } public Date getAddDate() { return this.addDate; } public void setAddDate(Date addDate) { this.addDate = addDate; } public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status; } public Set getSupplierPaidOnlines() { return this.supplierPaidOnlines; } public void setSupplierPaidOnlines(Set supplierPaidOnlines) { this.supplierPaidOnlines = supplierPaidOnlines; } public Set getSupplierPaidCashes() { return this.supplierPaidCashes; } public void setSupplierPaidCashes(Set supplierPaidCashes) { this.supplierPaidCashes = supplierPaidCashes; } public Set getSupplierPaidChecks() { return this.supplierPaidChecks; } public void setSupplierPaidChecks(Set supplierPaidChecks) { this.supplierPaidChecks = supplierPaidChecks; }}
编辑
我想设置的各个领域SupplierPaidDetails
,包括集(supplierPaidOnlines
,supplierPaidCashes
,supplierPaidChecks
这些可以包含许多情况下),并supplierPaymentDetails
从JSP
如何解决以上错误。
答案1
小编典典根据错误
Error setting expression ''spa.amount'' with value ''[Ljava.lang.String;@10dd65e''
似乎OGNL试图类型的值设置String[]
到amount
财产spa
豆。
进一步阅读
ognl.OgnlException: target is null for setProperty(null, "amount", [Ljava.lang.String;@10dd65e)
看起来就像spa
reference是null
,因此OGNL无法将值设置为a,null
因为它将引发空指针异常。
要解决此问题,您应该初始化的引用spa
。
接下来,由于使用模型驱动,因此出现了问题。模型驱动的拦截器将模型推入值堆栈的顶部,该值堆栈是OGNL根。并且您已初始化的实例spa
。似乎OGNL即使从值堆栈的顶部向下进行搜索也找不到的实例spa
。因此,要直接访问动作属性,您可以使用此答案中描述的技术,通过Struts2.3.16中的ModelDriven将参数传递给动作。
OGNL希望参考的方法spa
是
public void setAmount(String[] amounts) { this.amounts = amounts;}
您没有这种方法,并且您可能不希望收到字符串数组。但是问题是您正在这样做。因为具有相同名称的参数被打包到中String[]
。若要具有与每个迭代对象对应的不同名称,则应使用索引属性名称。您可以找到一个示例,该示例中的索引属性是否使用Struts2从JSP重新填充ArrayList。
您的属性可直接从模型中获得,因为您的操作是模型驱动的,并且应该具有List<SupplierPaymentDetails>paidList
迭代的。您可以使用此属性来填充提交的值,也可以使用其他具有相同类型的值。
您可以学习ModelDriven示例,但不使用索引属性。
([Ljava/lang/String;)V的含义
https://blog.csdn.net/longaiyunlay/article/details/80049440
“([Ljava/lang/String;)V” 它是一种对函数返回值和参数的编码。这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。一个数组int[],就需要表示为这样"[I"。如果多个数组double[][][]就需要表示为这样 "[[[D"。也就是说每一个方括号开始,就表示一个数组维数。多个方框后面,就是数组 的类型。
如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;”结束。
比如"Ljava/lang/String;"就是表示类型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
当一个函数不需要返回参数类型时,就使用”V”来表示。
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i, Class c);
"([B)V"就是表示void String(byte[] bytes);
Java 类型
符号
Boolean
Z
Byte
B
Char
C
Short
S
Int
I
Long
J
Float
F
Double
D
Void
V
objects对象
以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。比如:Ljava/lang/String;如果是嵌套类,则用$来表示嵌套。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"
另外数组类型的简写,则用"["加上如表A所示的对应类型的简写形式进行表示就可以了,
比如:[I 表示 int [];[L/java/lang/objects;表示Objects[],另外。引用类型(除基本类型的数组外)的标示最后都有个";"
例如:
"()V" 就表示void Func();
"(II)V" 表示 void Func(int, int);
"(Ljava/lang/String;Ljava/lang/String;)I".表示 int Func(String,String)
com.sun.xml.bind.v2.model.nav.Navigator.isSameType(Ljava/lang/Object;Ljava/lang/Object;)Z
Error injecting constructor, java.lang.NoSuchMethodError: com.sun.xml.bind.v2.model.nav.Navigator.isSameType(Ljava/lang/Object;Ljava/lang/Object;)Z at org.apache.hadoop.mapreduce.v2.app.webapp.JAXBContextResolver.<init>(JAXBContextResolver.java:70) at org.apache.hadoop.mapreduce.v2.app.webapp.AMWebApp.setup(AMWebApp.java:33) while locating org.apache.hadoop.mapreduce.v2.app.webapp.JAXBContextResolver 1 error at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:987) at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013) at com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory$GuiceInstantiatedComponentProvider.getInstance(GuiceComponentProviderFactory.java:332) at com.sun.jersey.core.spi.component.ioc.IoCProviderFactory$ManagedSingleton.<init>(IoCProviderFactory.java:179) at com.sun.jersey.core.spi.component.ioc.IoCProviderFactory.wrap(IoCProviderFactory.java:100) at com.sun.jersey.core.spi.component.ioc.IoCProviderFactory._getComponentProvider(IoCProviderFactory.java:93) at com.sun.jersey.core.spi.component.ProviderFactory.getComponentProvider(ProviderFactory.java:153) at com.sun.jersey.core.spi.component.ProviderServices.getComponent(ProviderServices.java:251) at com.sun.jersey.core.spi.component.ProviderServices.getProviders(ProviderServices.java:148) at com.sun.jersey.core.spi.factory.ContextResolverFactory.init(ContextResolverFactory.java:83) at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1271) at com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:169) at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:775) at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:771) at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
Eova 在 delete 时出现 java.lang.Integer cannot be cast to [Ljava.lang.Object;
@Jieven 你好,想跟你请教个问题:如标题,在刚布好的项目中,添加修改都好着,但删除时就是报错!
java.lang.Integer cannot be cast to [Ljava.lang.Object;
Forge 1.12.2 Coremodding:java.lang.StringIndexOutOfBoundsException
如何解决Forge 1.12.2 Coremodding:java.lang.StringIndexOutOfBoundsException?
我尝试在 1.12.2 Forge 上制作一个 coremod,以修补 Lost Cities mod 中的一些缺失内容。 (来源:https://github.com/McJtyMods/LostCities/blob/1.12/src/main/java/mcjty/lostcities/dimensions/world/lost/BuildingInfo.java)
我和一个朋友写了这个 LostCitiesClasstransformer.java:(完整来源:https://github.com/Nick1st/LCPatches)
package seemdmax.lcpatches;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.IFGT;
import static org.objectweb.asm.Opcodes.IFLE;
import static org.objectweb.asm.Opcodes.IFNE;
import static org.objectweb.asm.Opcodes.ILOAD;
import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
import static org.objectweb.asm.Opcodes.GETFIELD;
import java.util.Arrays;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
import mcjty.lostcities.api.ILostCityBuilding;
import net.minecraft.launchwrapper.IClasstransformer;
public class LostCitiesClasstransformer implements IClasstransformer {
private static final String[] classesBeingTransformed = { "mcjty.lostcities.dimensions.world.lost.BuildingInfo","mcjty.lostcities.dimensions.world.terraingen.LostCitiesTerrainGenerator"};
@Override
public byte[] transform(String name,String transformedname,byte[] classBeingTransformed) {
boolean isObfuscated = !name.equals(transformedname);
int index = Arrays.asList(classesBeingTransformed).indexOf(transformedname);
return index != -1 ? transform(index,classBeingTransformed,isObfuscated) : classBeingTransformed;
}
private static byte[] transform(int index,byte[] classBeingTransformed,boolean isObfuscated) {
System.out.println("Transform " + classesBeingTransformed[index] + " got called!");
try {
ClassNode classNode = new ClassNode();
ClassReader classReader = new ClassReader(classBeingTransformed);
classReader.accept(classNode,2);
System.out.println("Transforming " + classesBeingTransformed[index] + " Is Obf: " + isObfuscated);
switch (index) {
case 0:
transformlCCellars(classNode,isObfuscated);
break;
case 1:
transformBuildingBorders(classNode,isObfuscated);
break;
}
ClassWriter classWriter = new ClassWriter(ClassWriter.COmpuTE_MAXS /*| ClassWriter.COmpuTE_FRAMES*/);
classNode.accept(classWriter);
return classWriter.toByteArray();
} catch (Exception e) {
e.printstacktrace();
}
return classBeingTransformed;
}
private static void transformBuildingBorders(ClassNode terrainGenClass,boolean isObfuscated) {
final String METHOD = isObfuscated ? "generateBuilding" : "generateBuilding";
final String METHOD_DESC = isObfuscated
? "(Lmcjty/lostcities/dimensions/world/lost/BuildingInfo;Lmcjty/lostcities/dimensions/world/ChunkHeightmap;)V"
: "(Lmcjty/lostcities/dimensions/world/lost/BuildingInfo;Lmcjty/lostcities/dimensions/world/ChunkHeightmap;)V";
for (MethodNode method : terrainGenClass.methods) {
if (method.name.equals(METHOD) && method.desc.equals(METHOD_DESC)) {
System.out.println("Found method in BuildingInfo to transform");
AbstractInsnNode targetNode = null;
for (AbstractInsnNode instruction : method.instructions.toArray()) {
if (instruction.getopcode() == ALOAD) {
if (((VarInsnNode) instruction).var == 1 & instruction.getNext().getopcode() == GETFIELD & instruction.getNext().getNext().getopcode() == IFLE) {
System.out.println("Matched");
targetNode = instruction.getNext().getNext();
break;
}
}
}
if (targetNode != null) {
System.out.println("Target Node valid");
InsnList toInsert = new InsnList();
toInsert.add(new VarInsnNode(ALOAD,1));
toInsert.add(
new MethodInsnNode(INVOKEVIRTUAL,"mcjty/lostcities/dimensions/world/lost/BuildingInfo","floorsBelowGround","I",false));
toInsert.add(
new MethodInsnNode(INVOKEVIRTUAL,"seemdmax/lcpatches/Constants","getKey","()Ljava/lang/String;","java/lang/String","endsWith","(Ljava/lang/String;)Z",false));
toInsert.add(new JumpInsnNode(IFNE,((JumpInsnNode) targetNode).label));
method.instructions.insert(targetNode,toInsert);
System.out.println("Transform done!");
} else {
System.out.println("Something went wrong transforming LostCitiesTerrainGenerator!");
}
}
}
}
private static void transformlCCellars(ClassNode buildingInfoClass,boolean isObfuscated) {
//This is already working
}
}
我要打补丁的原代码(Bytecode Outline):
L55
LINENUMBER 2338 L55
FRAME CHOP 3
ALOAD 1
GETFIELD mcjty/lostcities/dimensions/world/lost/BuildingInfo.floorsBelowGround : I
IFLE L68
包含我的更改的字节码大纲:
L55
LINENUMBER 2338 L55
FRAME CHOP 3
ALOAD 1
GETFIELD mcjty/lostcities/dimensions/world/lost/BuildingInfo.floorsBelowGround : I
IFLE L68
ALOAD 1
INVOKEVIRTUAL mcjty/lostcities/dimensions/world/lost/BuildingInfo.getBuildingType ()Ljava/lang/String;
LDC "#NOBORDER"
INVOKEVIRTUAL java/lang/String.endsWith (Ljava/lang/String;)Z
IFNE L68
我得到的堆栈跟踪:
java.lang.Stringindexoutofboundsexception: String index out of range: 1
at java.lang.String.charat(String.java:658)
at org.objectweb.asm.Type.getArgumentsAndReturnSizes(Type.java:420)
at org.objectweb.asm.MethodWriter.visitMethodInsn(MethodWriter.java:931)
at org.objectweb.asm.tree.MethodInsnNode.accept(MethodInsnNode.java:133)
at org.objectweb.asm.tree.InsnList.accept(InsnList.java:162)
at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:817)
at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:727)
at org.objectweb.asm.tree.ClassNode.accept(ClassNode.java:412)
at seemdmax.lcpatches.LostCitiesClasstransformer.transform(LostCitiesClasstransformer.java:59)
at seemdmax.lcpatches.LostCitiesClasstransformer.transform(LostCitiesClasstransformer.java:38)
at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:256)
at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176)
at java.lang.classLoader.loadClass(ClassLoader.java:418)
at java.lang.classLoader.loadClass(ClassLoader.java:351)
at mcjty.lostcities.dimensions.world.LostCityChunkGenerator.<init>(LostCityChunkGenerator.java:170)
at mcjty.lostcities.dimensions.world.LostWorldType.getChunkGenerator(LostWorldType.java:55)
at net.minecraft.world.WorldProvider.createChunkGenerator(WorldProvider.java:86)
at net.minecraft.world.WorldServer.createChunkProvider(WorldServer.java:890)
at net.minecraft.world.WorldServer.<init>(WorldServer.java:124)
at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:122)
at net.minecraft.server.integrated.IntegratedServer.init(IntegratedServer.java:160)
at net.minecraft.server.minecraftServer.run(minecraftServer.java:552)
at java.lang.Thread.run(Thread.java:748)
为什么我要对开源模组进行猴子补丁? 我需要它作为一个模组包; Curseforge 不允许在 modpack 中修改 jar。 McJty 说,他不想要第二个 LC 项目,但他可以使用 coremods/mixin 等修补 LC。
任何帮助将不胜感激。如果您需要了解更多详情,请随时询问。提前致谢。
解决方法
问题来了:
toInsert.add(
new MethodInsnNode(INVOKEVIRTUAL,"mcjty/lostcities/dimensions/world/lost/BuildingInfo","floorsBelowGround","I",false));
您试图调用 floorsBelowGround
就像它是一个方法,但它实际上是一个字段。您需要使用 GETFIELD
FieldInsnNode
而不是 INVOKEVIRTUAL
MethodInsnNode
。
关于将值'[Ljava.lang.String; @ 10dd65e')设置为表达式'spa.amount'时出错和将指定数据区的字符串数据以ascii码形式显示在屏幕上的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于([Ljava/lang/String;)V的含义、com.sun.xml.bind.v2.model.nav.Navigator.isSameType(Ljava/lang/Object;Ljava/lang/Object;)Z、Eova 在 delete 时出现 java.lang.Integer cannot be cast to [Ljava.lang.Object;、Forge 1.12.2 Coremodding:java.lang.StringIndexOutOfBoundsException的相关知识,请在本站寻找。
本文标签: