【问题标题】:NoClassDefFoundError: mapping files from CommonsMultipartFile to byte[]NoClassDefFoundError:将文件从 CommonsMultipartFile 映射到 byte[]
【发布时间】:2012-10-30 14:20:32
【问题描述】:

我正在尝试使用推土机从 CommonsMultipartFile 映射到 byte[]。

我知道我需要一个 customConverter 因为推土机对 CommonsMultipartFile 类型一无所知,所以我做到了:

    public class FileJtfConverter extends DozerConverter<CommonsMultipartFile, byte[]> {

    /**
     * Constructor
     */
    public FileJtfConverter() {
        super(CommonsMultipartFile.class, byte[].class);
    }

    @Override
    public final byte[] convertTo(CommonsMultipartFile a, byte[] b) {
        if (a != null) {
            return a.getBytes();
        }
        return null;
    }

    @Override
    public final CommonsMultipartFile convertFrom(byte[] b, CommonsMultipartFile a) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    }

还有我的推土机 xml 文件:

<mapping type="one-way">        
    <class-a>myPackage.ClassA
    </class-a>
    <class-b>myPackage.ClassB
    </class-b>
    ...
    <field custom-converter="es.xunta.formacion.sifo3.transporte.util.converter.FileJtfConverter">
       <a>anexo</a>
       <b>anexo</b>
    </field>
</mapping>

A 类和 B 类在哪里:

public class ClassA{
    ...
    private CommonsMultipartFile anexo;
    ...
    public final CommonsMultipartFile getAnexo() {
    return anexo;
    }

    public final void setAnexo(CommonsMultipartFile anexo) {
    this.anexo = anexo;
    }
}

public class ClassB{
    ...
    protected byte[] anexo;
    ...
    public void setAnexo(byte[] value) {
    this.anexo = ((byte[]) value);
    }

    public byte[] getAnexoPago() {
        return anexoPago;
    }
}

一切似乎都很好,但它抛出了一个异常: org.dozer.MappingException: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException

这很奇怪,因为我已经在 pom.xml 文件中定义了依赖项...

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>                
    </dependency>   

任何想法..?非常感谢!

【问题讨论】:

  • 添加 commons-fileupload 到你的类路径。

标签: java spring portlet dozer


【解决方案1】:

如果您使用的是 Spring MVC,您可以在您的方法中注册一个 CustomEditor,并使用 @InitBinder 注释。

已经有一个ByteArrayMultipartFileEditor 可以为您自动从MultipartFile 转换为byte[]

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
}

您的域对象/表单可以直接持有byte[] 而不是MultipartFile

我相信你也可以对 Spring Portlet MVC 做同样的事情。

【讨论】:

  • 听起来不错,但我使用的是 CommonsMultipartFile,而不是 MultipartFile。 CommonsMultipartFile 有类似的东西吗?
  • CommonsMultipartFile 实现MultipartFile。试试吧,它可能会奏效。
  • 这个方法我试过了,但是不行。如果我使用这个 initBinder,我应该将我的 ClassA 参数从私有 CommonsMultipartFile anexo 更改为私有 byte[] anexo,不是吗?这不是我想要做的,但它可以工作......
  • 是的,您可以摆脱推土机和您可能为此编写的任何其他转换逻辑。
  • 好的,它有效。这不是我想要的,我不得不改变一些东西,但最终它起作用了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2021-10-25
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多