JSON 구문 분석 오류:ID에 POJO가 이미 있습니다.
이미 이 주제에 대해 몇 가지 질문을 보았지만, 적용을 시도했지만 오류가 계속되어 제 사례에 적용할 수 없었습니다.그래서 저는 제 상황을 폭로하게 됐습니다.
저는 그것에 대한 댓글을 읽고 엔티데이드 수업에서 칼럼 아이디 엔티데이드의 이름을 바꾸면 성공할 수 있다고 말했습니다.하지만 저는 데이터베이스를 변경할 수 없습니다.
저는 넣으려고 하는데요.scope= Distritos.class
내 안에@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idDistrito")
하지만 효과가 없었습니다.
도움이 필요합니다.
저는 Angular와 함께 스프링 MVC를 사용하여 데이터를 데이터베이스에 유지하려고 합니다.데이터 저장을 클릭하면 이 오류가 발생합니다.
2017-09-29 13:28:02.126 WARN 2716 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Already had POJO for id (java.lang.Long) [[ObjectId: key=1, type=com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator, scope=java.lang.Object]]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.Long) [[ObjectId: key=1, type=com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator, scope=java.lang.Object]] (through reference chain: digifred.global.model.Distritos["idEntidade"]->digifred.global.model.Entidades["idEntidade"])
2017-09-29 13:28:02.126 WARN 2716 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Already had POJO for id (java.lang.Long) [[ObjectId: key=1, type=com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator, scope=java.lang.Object]]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.Long) [[ObjectId: key=1, type=com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator, scope=java.lang.Object]] (through reference chain: digifred.global.model.Distritos["idEntidade"]->digifred.global.model.Entidades["idEntidade"])
2017-09-29 13:46:14.096 INFO 2716 --- [ Thread-46] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@53b2ae5: startup date [Fri Sep 29 13:23:36 BRT 2017]; root of context hierarchy
나는 이런 수업이 있습니다.
@Entity
@Table(name = "distritos", schema="glb")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Distritos.findAll", query = "SELECT d FROM Distritos d"),
@NamedQuery(name = "Distritos.findByIdDistrito", query = "SELECT d FROM Distritos d WHERE d.idDistrito = :idDistrito"),
@NamedQuery(name = "Distritos.findByNome", query = "SELECT d FROM Distritos d WHERE d.nome = :nome"),
@NamedQuery(name = "Distritos.findByCodigoDne", query = "SELECT d FROM Distritos d WHERE d.codigoDne = :codigoDne"),
@NamedQuery(name = "Distritos.findByFlagAtivo", query = "SELECT d FROM Distritos d WHERE d.flagAtivo = :flagAtivo")})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idDistrito")
public class Distritos implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_distrito")
private Long idDistrito;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 70)
@Column(name = "nome")
private String nome;
@Size(max = 8)
@Column(name = "codigo_dne")
private String codigoDne;
@Column(name = "flag_ativo")
private Integer flagAtivo;
@JoinColumn()
@ManyToOne
private Entidades idEntidade;
@JoinColumn()
@ManyToOne(optional = false)
private Municipios idMunicipio;
@JoinColumn()
@ManyToOne(optional = false)
private Ufs idUf;
gets and sets ..
}
엔티데이즈급
@Entity
@Table(name = "entidades", schema="glb")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Entidades.findAll", query = "SELECT e FROM Entidades e"),
@NamedQuery(name = "Entidades.findByIdEntidade", query = "SELECT e FROM Entidades e WHERE e.idEntidade = :idEntidade"),
@NamedQuery(name = "Entidades.findByBairro", query = "SELECT e FROM Entidades e WHERE e.bairro = :bairro"),
@NamedQuery(name = "Entidades.findByBrasao", query = "SELECT e FROM Entidades e WHERE e.brasao = :brasao"),
@NamedQuery(name = "Entidades.findByCnpj", query = "SELECT e FROM Entidades e WHERE e.cnpj = :cnpj"),
@NamedQuery(name = "Entidades.findByComplemento", query = "SELECT e FROM Entidades e WHERE e.complemento = :complemento"),
@NamedQuery(name = "Entidades.findByEmail", query = "SELECT e FROM Entidades e WHERE e.email = :email"),
@NamedQuery(name = "Entidades.findByLogradouro", query = "SELECT e FROM Entidades e WHERE e.logradouro = :logradouro"),
@NamedQuery(name = "Entidades.findByNome", query = "SELECT e FROM Entidades e WHERE e.nome = :nome"),
@NamedQuery(name = "Entidades.findByNumero", query = "SELECT e FROM Entidades e WHERE e.numero = :numero"),
@NamedQuery(name = "Entidades.findBySigla", query = "SELECT e FROM Entidades e WHERE e.sigla = :sigla"),
@NamedQuery(name = "Entidades.findByTelefone", query = "SELECT e FROM Entidades e WHERE e.telefone = :telefone")})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idEntidade")
public class Entidades implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private Long idEntidade;
@Size(max = 50)
private String bairro;
private BigInteger brasao;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 14)
private String cnpj;
@Size(max = 20)
private String complemento;
// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="E-mail inválido")//if the field contains email address consider using this annotation to enforce field validation
@Size(max = 30)
private String email;
@Size(max = 50)
private String logradouro;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 70)
private String nome;
@Size(max = 20)
private String numero;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 4)
private String sigla;
@Size(max = 12)
private String telefone;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<EntidadesAdministradores> entidadesAdministradoresCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "entidades")
private Collection<Bairros> bairrosCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<PessoasDeficiencias> pessoasDeficienciasCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<PessoasEnderecos> pessoasEnderecosCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<EntidadesLicencas> entidadesLicencasCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<PessoasContatos> pessoasContatosCollection;
@OneToMany(mappedBy = "idEntidade")
private Collection<Logradouros> logradourosCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<Pessoas> pessoasCollection;
@JoinColumn()
@ManyToOne(optional = false)
private Municipios idMunicipio;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEntidade")
private Collection<PessoasCaracteristicas> pessoasCaracteristicasCollection;
public Entidades() {
}
.... gets and sets . .
}
클래스 디스트리토스 컨트롤러
@RestController
@RequestMapping(value="/user")
public class DistritosController {
@Autowired
DistritosService distritosService;
@RequestMapping(method = RequestMethod.POST, value = "/distritos", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Distritos> cadastrarDistritos(@RequestBody Distritos distritos) {
Distritos distritosCadastrado = distritosService.cadastrar(distritos);
return new ResponseEntity<Distritos>(distritosCadastrado, HttpStatus.CREATED);
}
@RequestMapping(method = RequestMethod.GET, value = "/distritos", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Collection<Distritos>> buscarTodosDistritos() {
Collection<Distritos> distritosBuscados = distritosService.buscarTodos();
return new ResponseEntity<>(distritosBuscados, HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.GET, value = "/distritos/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Distritos> buscarDistritosPorId(@PathVariable int id) {
Distritos distritos = distritosService.buscaPorId(id);
return new ResponseEntity<>(distritos, HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.DELETE, value = "/distritos/{id}")
public ResponseEntity<Distritos> excluirDistritos(@PathVariable int id) {
Distritos distritoEncontrado = distritosService.buscaPorId(id);
if (distritoEncontrado == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
distritosService.excluir(distritoEncontrado);
return new ResponseEntity<>(HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.PUT, value = "/distritos", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Distritos> alterarDistritos(@RequestBody Distritos distritos) {
Distritos distritoAlterado = distritosService.alterar(distritos);
return new ResponseEntity<Distritos>(distritoAlterado, HttpStatus.OK);
}
}
두 가지 문제가 있습니다.
1. 아이덴티티 스코프
두 클래스의 제너레이터 유형이 동일하므로 두 클래스 모두 범위를 지정해야 합니다.ObjectIdGenerators.PropertyGenerator.class
.
범위는 개체 ID의 적용 가능성을 정의하는 데 사용됩니다. 모든 ID는 범위 내에서 고유해야 합니다. 여기서 범위는 이 값과 생성기 유형의 조합으로 정의됩니다.비교는 단순 동등성입니다. 즉, 유형 생성기 유형과 범위 클래스가 모두 같아야 합니다.범위는 필요한 생성기 수를 결정하는 데 사용됩니다. 일반적으로 두 개 이상의 범위는 외부 Object Id에 중복되는 값 도메인이 있는 경우에만 필요합니다(즉, 일부 제한된 범위 내에서만 고유).
위해서Distritos
:
@JsonIdentityInfo(scope = Distritos.class, generator = ObjectIdGenerators.PropertyGenerator.class, property = "idDistrito")
그리고.Entidades
:
@JsonIdentityInfo(scope = Entidades.class, generator = ObjectIdGenerators.PropertyGenerator.class, property = "idEntidade")
2. 필드명칭
@JoinColumn()
@ManyToOne
private Entidades idEntidade;
왠만한 일에는 지장이 없습니다
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private Long idEntidade;
잭슨 역직렬화기를 지나칠 때Distritos
객체(포함)Entidades
예를 들어 내부).
디버깅을 좀 해봤는데 BeanDeserializer(필드를 이름으로 해결하는)가 속성 필드를 ID 필드와 동일하게 이름을 지정하여 deserialize하지 못해서 변경했습니다.idEntidade
로.entidade
인에Distritos
학급.
이러한 변경 후 샘플 프로젝트가 정상적으로 작동합니다(수업에서 일부 필드를 삭제했기 때문에 -Distritos.idMunicipio
,Distritos.idUf
그 밖의Collection
엔티데이즈(Entidades)에서 s).다른 수업이 있는지 확인해야 합니다.Municipios
그리고.Ufs
) 동일한 문제가 있으며, 이 문제도 해결합니다.
언급URL : https://stackoverflow.com/questions/46493841/json-parse-error-already-had-pojo-for-id
'programing' 카테고리의 다른 글
실행 중인 컨테이너가 없는데도 이미지를 제거할 수 없습니다. (0) | 2023.10.17 |
---|---|
Java PreparedStatement 마지막으로 삽입한 상태 (0) | 2023.10.17 |
ntext 열에 있는 데이터 길이? (0) | 2023.10.17 |
jquery 데이터 선택기 (0) | 2023.10.17 |
카운터 개체를 판다 데이터 프레임으로 변환 (0) | 2023.10.17 |