GVKun编程网logo

将值'[Ljava.lang.String; @ 10dd65e')设置为表达式'spa.amount'时出错(将指定数据区的字符串数据以ascii码形式显示在屏幕上)

9

本文将分享将值'[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; @ 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,包括集(supplierPaidOnlinessupplierPaidCashessupplierPaidChecks这些可以包含许多情况下),并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)

看起来就像spareference是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的含义

([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

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;

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

如何解决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的相关知识,请在本站寻找。

本文标签: