Estoy construyendo un Muelle RESTO de Datos de la aplicación y estoy teniendo algunos problemas cuando trato de PUBLICAR. La principal entidad que tiene otras dos entidades relacionadas anidados.

Hay un «questionary» objeto que tiene muchas respuestas y cada una de estas respuestas tienen muchas respuestas.

Puedo generar un JSON como este de la parte frontal de la aplicación para PUBLICAR el questionary:

{
    "user": "http://localhost:8080/users/1",
    "status": 1,
    "answers": [
        {
            "img": "urlOfImg",
            "question": "http://localhost:8080/question/6",
            "replies": [
                {
                    "literal": "http://localhost:8080/literal/1",
                    "result": "6"
                },
                {
                    "literal": "http://localhost:8080/literal/1",
                    "result": "6"
                }
            ]
        },
        {
            "img": "urlOfImg",
            "question": "http://localhost:8080/question/6",
            "replies": [
                {
                    "literal": "http://localhost:8080/literal/3",
                    "result": "10"
                }
            ]
        }
    ]
}

Pero cuando trato de post, me sale el error siga respuesta:

{

    "cause" : {
        "cause" : {
          "cause" : null,
          "message" : "Template must not be null or empty!"
        },
        "message" : "Template must not be null or empty! (through reference chain: project.models.Questionary[\"answers\"])"
      },
      "message" : "Could not read JSON: Template must not be null or empty! (through reference chain: project.models.Questionary[\"answers\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Template must not be null or empty! (through reference chain: project.models.Questionary[\"answers\"])"
}

Edición:

También agrego mi repositorio:

@RepositoryRestResource(collectionResourceRel = "questionaries", path = "questionaries")
public interface InspeccionRepository extends JpaRepository<Inspeccion, Integer> {
    @RestResource(rel="byUser", path="byUser")
    public List<Questionary> findByUser (@Param("user") User user);
}

Mi Entidad Questionary clase es :

@Entity @Table(name="QUESTIONARY", schema="enco" )
public class Questionary implements Serializable {
private static final long serialVersionUID = 1L;
//----------------------------------------------------------------------
//ENTITY PRIMARY KEY ( BASED ON A SINGLE FIELD )
//----------------------------------------------------------------------
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEC_QUESTIONARY")
@SequenceGenerator(name = "SEC_QUESTIONARY", sequenceName = "ENCO.SEC_QUESTIONARY", allocationSize = 1)
@Column(name="IDQUES", nullable=false)
private Integer idques        ;
//----------------------------------------------------------------------
//ENTITY DATA FIELDS 
//----------------------------------------------------------------------    
@Column(name="ESTATUS")
private Integer estatus       ;
//----------------------------------------------------------------------
//ENTITY LINKS ( RELATIONSHIP )
//----------------------------------------------------------------------
@ManyToOne
@JoinColumn(name="IDUSER", referencedColumnName="IDUSER")
private User user;
@OneToMany(mappedBy="questionary", targetEntity=Answer.class)
private List<Answer> answers;
//----------------------------------------------------------------------
//CONSTRUCTOR(S)
//----------------------------------------------------------------------
public Questionary()
{
super();
}
//----------------------------------------------------------------------
//GETTERS & SETTERS FOR FIELDS
//----------------------------------------------------------------------
//--- DATABASE MAPPING : IDNSE ( NUMBER ) 
public void setIdnse( Integer idnse )
{
this.idnse = idnse;
}
public Integer getIdnse()
{
return this.idnse;
}
//--- DATABASE MAPPING : ESTADO ( NUMBER ) 
public void setEstatus Integer estatus )
{
this.estatus = estatus;
}
public Integer getEstatus()
{
return this.estatus;
}      
//----------------------------------------------------------------------
//GETTERS & SETTERS FOR LINKS
//----------------------------------------------------------------------
public void setUser( Usuario user )
{
this.user = user;
}
public User getUser()
{
return this.user;
}
public void setAnswers( List<Respuesta> answers )
{
this.answers = answer;
}
public List<Answer> getAnswers()
{
return this.answers;
}
//Get Complete Object method      public List<Answer>
getAnswerComplete() {
List<Answer> answers = this.answers;
return answers;
}
}

Mi Respuesta De La Entidad:

 @Entity @Table(name="ANSWER", schema="enco" ) public class Answer
implements Serializable {
private static final long serialVersionUID = 1L;
//----------------------------------------------------------------------
//ENTITY PRIMARY KEY ( BASED ON A SINGLE FIELD )
//----------------------------------------------------------------------
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEC_ANSWER")
@SequenceGenerator(name = "SEC_ANSWER", sequenceName = "ENCOADMIN.SEC_ANSWER", allocationSize = 1)
@Column(name="IDANS", nullable=false)
private Integer idans        ;
//----------------------------------------------------------------------
//ENTITY DATA FIELDS 
//----------------------------------------------------------------------    
@Column(name="IMG", length=100)
private String     img       ;
//----------------------------------------------------------------------
//ENTITY LINKS ( RELATIONSHIP )
//----------------------------------------------------------------------
@ManyToOne
@JoinColumn(name="IDQUES", referencedColumnName="IDQUES")
private Questionary questionary  ;
@OneToMany(mappedBy="answer", targetEntity=Reply.class)
private List<Reply> replies;
@ManyToOne
@JoinColumn(name="IDQUE", referencedColumnName="IDQUE")
private Question Question    ;
//----------------------------------------------------------------------
//CONSTRUCTOR(S)
//----------------------------------------------------------------------
public Answer()
{
super();
}
//----------------------------------------------------------------------
//GETTER & SETTER FOR THE KEY FIELD
//----------------------------------------------------------------------
public void setIdans( Integer idans )
{
this.idans = idans ;
}
public Integer getIdans()
{
return this.idans;
}
//----------------------------------------------------------------------
//GETTERS & SETTERS FOR FIELDS
//----------------------------------------------------------------------
//--- DATABASE MAPPING : IMAGEN ( VARCHAR2 ) 
public void setImg( String img )
{
this.img = img;
}
public String getImg()
{
return this.img;
}
//----------------------------------------------------------------------
//GETTERS & SETTERS FOR LINKS
//----------------------------------------------------------------------
public void setQuestionary( Questionary questionary )
{
this.questionary = questionary;
}
public Questionary getQuestionary()
{
return this.questionary;
}
public void setReplies( List<Reply> contestaciones )
{
this.replies = replies;
}
public List<Reply> getReplies()
{
return this.replies;
}
public void setQuestion( Question question )
{
this.question = question;
}
public Question getQuestion()
{
return this.question;
}
}

Y este es el error de la consola:

Caused by: com.fasterxml.jackson.databind.JsonMappingException:
Template must not be null or empty! (through reference chain:
project.models.Questionary["answers"])  at
com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
~[jackson-databind-2.3.3.jar:2.3.3]    at *snip*
  • Podría usted mostrar su método de controlador, stacktrace y POJO clase?
  • He editar el post principal con toda la información que usted solicita. Gracias por tu ayuda.
  • Tal vez el problema está en el mal de datos? Está bien: "question": "http://localhost:8080/question/6". Tal vez debería tener este aspecto: "question": 6. ¿Por qué te envío URLs en lugar de los ids?
  • Debido a que existe una relación entre las preguntas y respuestas, estos parte está bien, yo lo he probado Individualy y funciona sin problema. El problema es cuando me nido y objeto dentro de otro en una lista. Por ejemplo, si hago este primer post sólo la inspección y un puesto por cada respuesta y otro para cada respuesta es de trabajo pero pienso que es absurdo cuando tengo un questionary con más de 350 respuestas de cada una de ellas tiene 3 o 4 respuestas…. Tiene que ser una manera de hacerlo en un objeto anidado…
  • Su setter para respuestas toma una lista de Respuesta objetos en lugar de Responder a los objetos, es esto un error o a propósito?
  • Eso es porque tengo la app en español y he traducido a todos por el post y yo no veo eso. Respuesta es la misma de Respuesta ;).
  • ¿Alguna vez has averiguar esto?
  • Creo que esta página se describe la manera correcta de conseguir este trabajo, pero cuando me pruebe el método de allí, me sale el mismo error que debes hacer: github.com/spring-projects/spring-data-rest/wiki/…
  • Mismo aquí, ¿la solución?

InformationsquelleAutor 73nko | 2014-07-04

4 Comentarios

  1. 18

    Trate de añadir @RestResource(exported = false) en campo answers en clase Questionary.

    Según yo, este error se produce porque el deserializer espera URIs para buscar las respuestas, en lugar de tener las respuestas anidadas en el JSON. Añadir la anotación le dice que busque en JSON en lugar.

    • Esta solución funcionó a la perfección para mí. Después de este cambio, yo era capaz de agregar no se conservan elementos a una colección de un uno-a-muchos recursos.
    • Pero ahora usted no puede utilizar el CRUD-métodos de su Questionary-repositorio, porque ellos no van a estar expuestos. Creación de pregunta siempre manejado por la Respuesta-repositorio, porque en el Questionary-repositorio no será permitido. Es ese derecho?
    • No estoy seguro si esto va a ayudar a nadie, pero en la aplicación que estoy trabajando con @RestResource(exported = false) necesarios para ser agregado al repositorio de archivos, por ejemplo, QuestionaryController, QuestionaryModel, QuestionaryRepo. No estoy seguro si esa es la norma en la primavera o no, sólo he trabajado con él hace un par de meses por un simple servicio de fondo, pero pensé que podría ayudar a alguien en una situación similar.
  2. 5

    Todavía estoy viendo este error con 2.3.0.M1, pero finalmente encontré una solución.

    La cuestión básica es esta: Si usted publique la url de la entidad en el JSON, funciona. Si publica el real de la entidad JSON, no. Intenta deserializar la entidad JSON en un URI, que no.

    Parece que el problema es con los dos TypeConstrainedMappingJackson2Httpmessageconverter objetos de la primavera de datos de descanso crea en su configuración (en RepositoryRestMvcConfiguration.defaultMessageConverters()).

    Finalmente llegué alrededor de la cuestión mediante la configuración de los tipos de medios admitidos de la messageConverters por lo que se salta los dos hits y la llanura MappingJackson2HttpMessageConverter, que funciona bien con dichas entidades.

    Por ejemplo, si usted extender RepositoryRestMvcConfiguration y agregar este método, a continuación, cuando se envía una solicitud con el contenido-tipo de ‘application/json’, llegará a la llanura MappingJackson2HttpMessageConverter en lugar de tratar de deserializar en Uri:

    @Override
    public void configureHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    ((MappingJackson2HttpMessageConverter) messageConverters.get(0))
    .setSupportedMediaTypes(asList(MediaTypes.HAL_JSON));
    ((MappingJackson2HttpMessageConverter) messageConverters.get(2))
    .setSupportedMediaTypes(asList(MediaType.APPLICATION_JSON));
    }

    Que configura el mensaje de convertidores producido por defaultMessageConverters() en RepositoryRestMvcConfiguration.

    Tenga en cuenta que la llanura objectMapper no puede manejar las Uri en el JSON – usted todavía necesita para golpear a uno de los dos mensaje preconfigurado convertidores cualquier momento pasar URIs de entidades asociadas.

    • ¿Quiere usted decir que usted no puede PUBLICAR un objeto que tiene un campo como una entidad y otra como un campo de URI?
    • Sí, hasta que este se fijo que no funcionan. Si reemplaza configureHttpMessageConverters como he sugerido, usted todavía tiene que elegir uno de estrategia por solicitud – incrustar todas las entidades como JSON o enviar URIs para todos ellos y establecer el tipo de contenido de la solicitud debidamente, de forma que llega a la correcta messageConverter.
    • Sabes por casualidad si hay un informe de error para esto?
    • Este parece el mismo problema: jira.de la primavera.io/browse/DATAREST-377
  3. 4

    Un problema con su JSON es que usted está tratando de deserializar una cadena como una pregunta:

    "question": "http://localhost:8080/question/6"

    En su Answer objeto, Jackson está a la espera de un objeto para la pregunta. Parece que se están usando URLs para los Identificadores, así que en lugar de una cadena que necesita para pasar algo como esto para tu pregunta:

    "question": {
    "id": "http://localhost:8080/question/6"
    }
    • Sam, gracias por tu respuesta, pero aún no funciona. Tengo el mismo error. Cualquier otra idea?
  4. 0

    Intente actualizar «la Primavera de los Datos de Arranque RESTO de Arranque» de la biblioteca. Trabajó para mí.

    • Estoy usando spring-boot-starter-data-rest-1.2.5.RELEASE.jar. Pero todavía tengo un problema. La versión que tengo que actualizar?

Dejar respuesta

Please enter your comment!
Please enter your name here