无法从JSON字符串实例化类型的值;没有单个字符串构造函数/工厂方法。

5
我有以下实体:
@Entity
@Table(name="APLICACAO")
public class Aplicacao implements Serializable, Entidade {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="CD_APLICACAO")
    private Long codigo;

    @Column(name="NM_APLICACAO")
    @NotNull
    private String nome;

    @ManyToOne
    @JoinColumn(name="CD_GRUPO")
    private GrupoAplicacao grupoAplicacao;

    ....

}

同时也是这样:
@Entity
@Table(name = "GRUPO_APLICACAO")
public class GrupoAplicacao implements Serializable, Entidade {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CD_GRUPO")
    private Long codigo;

    @Column(name = "NM_GRUPO")
    @NotNull
    private String nome;

    @OneToMany(mappedBy = "grupoAplicacao",fetch=FetchType.EAGER)
    private List<Aplicacao> listaAplicacao;

    @OneToMany(mappedBy = "grupoAplicacao",fetch=FetchType.EAGER)
    private List<GrupoAplicacaoUsuario> listaGrupoAplicacaoUsuario;

    ....

}

我要调用HTML控制器"aplicacoesCreateController",代码如下:

<div class="col-xs-12" ng-controller="aplicacoesCreateController">
    <form class="form-horizontal form-medium center" role="form" name="form" ng-submit="save()">
        <div class="form-group">
            <label for="nome" class="col-xs-4 control-label">Nome</label>
            <div class="col-xs-8">
                <input type="text" class="form-control input-sm" id="nome" placeholder="Nome" required ng-model="aplicacao.nome">
            </div>
        </div>
        <div class="form-group">
            <label for="nome" class="col-xs-4 control-label">Nome</label>
            <div class="col-xs-8">
                <select class="form-control" required ng-model="aplicacao.grupoAplicacao">
                        <option ng-repeat="grupo in grupos" value="{{ grupo }}">
                            {{ grupo.nome }}
                        </option>
                </select>
            </div>
        </div>
        <div class="form-group">
            <div class="col-xs-offset-4 col-xs-8">
            <button type="submit" class="btn btn-lg btn-size-md">Salvar</button>
            </div>
        </div>
    </form>
</div>

我的控制器JavaScript代码:

app.controller('aplicacoesCreateController', ['$scope','aplicacoesService','$location','reloadService','gruposService',
function ($scope,aplicacoesService,$location,reloadService,gruposService) {
    $scope.grupos = gruposService.list();
    $scope.save = function () {
        aplicacoesService.create($scope.aplicacao);
        reloadService.on('#/aplicacoes');
    };
}]);

并提供JavaScript服务:

app.factory('gruposService', ['$resource', function ($resource) {

    return $resource('resources/grupo-aplicacao', {}, {
        'list': { method: 'GET', isArray: true }
    });

}]);

其他服务:

app.factory('aplicacoesService', ['$resource', function ($resource) {

    return $resource('resources/aplicacao', {}, {
        'list': { method: 'GET', isArray: true },
        'create': { method: 'POST' }
    });

}]);

当插入应用实体时,会显示以下错误:
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class br.com.techpeople.grape.entity.GrupoAplicacao] from JSON String; no single-String constructor/factory method (through reference chain: br.com.techpeople.grape.entity.Aplicacao["grupoAplicacao"])

你能帮我解决这个错误吗?

4个回答

12

您收到的错误提示是需要在您的GrupoAplicacao类中编写一个接受字符串参数的构造函数。

@Entity
@Table(name = "GRUPO_APLICACAO")
public class GrupoAplicacao implements Serializable, Entidade {

....

    GrupoAplicacao(String stringJSON){
        setters;
    }

}

1

曾经有一个任务和同样的问题在这个范围内: +有限时间,+ee: +jax-rs && +persistence, +gson; 我当时解决了它:

@Entity
@XmlRootElement
@Table(name="element")
public class Element implements Serializable {
    public Element(String stringJSON){
        Gson g = new Gson();
        Element a = g.fromJson(stringJSON, this.getClass());
        this.setId(a.getId());
        this.setProperty(a.getProperty());
    }

    public Element() {}
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    ...
}

这很接近Gustavo Bitencourt的解决方案,可能范围略有不同。

1
感谢 @BoatCode!
在我的构造函数中,我做了以下操作:
public GrupoAplicacao(String grupoAplicacaoJSON) {
    Gson gson = new Gson();
    GrupoAplicacao grupoAplicacao = gson.fromJson(grupoAplicacaoJSON, GrupoAplicacao.class);
    this.codigo = grupoAplicacao.getCodigo();
    this.nome = grupoAplicacao.getNome();
    this.listaAplicacao = grupoAplicacao.getListaAplicacao();
    this.listaGrupoAplicacaoUsuario = grupoAplicacao.getListaGrupoAplicacaoUsuario();
}

添加Gson库并设置GrupoAplicacao类的变量。

0

看起来你正在从JavaScript发送一个字符串而不是一个对象。你可以尝试发送JSON.parse(stringGrupoAplicacao)

这样,在服务器端,对象应该会自动反序列化,无需创建特殊的构造函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接