2016-06-25 4 views
1

Mein Ziel ist es, Restdienste auf Spring Boot Web-Anwendung arbeiten zu lassen. Aber ich kämpfe mit herauszufinden, wie Antwort zu sagen, nur Objekt Json enthalten.Wie bekomme ich eine Response-Antwort, die nur den JSON eines bestimmten Objekts enthält?

genauer zu sein, wenn http://localhost:8080/api/db/Keyboard/2 Aufruf, beabsichtige ich, mit der ID 2 im JSON-Format und nur Objekt zu erhalten:

{ 
    "id": 2, 
    "language": "en" 
} 

Aber stattdessen erhalte ich:

{ 
    "status": 200, 
    "entity": { 
    "id": 2, 
    "language": "en" 
    }, 
    "metadata": {}, 
    "length": -1, 
    "allowedMethods": [], 
    "cookies": {}, 
    "headers": {}, 
    "actualEntity": { 
    "id": 2, 
    "language": "en" 
    }, 
    "links": [], 
    "statusInfo": { 
    "reasonPhrase": "OK", 
    "statusCode": 200, 
    "family": "SUCCESSFUL" 
    }, 
    "stringHeaders": {} 
} 

Offensichtlich Antwort enthält auch viel Info. Nur der Entitätsteil wird benötigt. Wie erreiche ich das beabsichtigte Ergebnis/passe bedingt die Antwort an?

Unten einige Dateien, die relevant sein könnten.

TestController.java:

import java.util.HashMap; 
import java.util.Map; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.ResponseBuilder; 
import javax.ws.rs.core.Response.Status; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import main.domain.DaoApi; 
import main.domain.Keyboard; 

@RestController 
public class TestController<T, K> { 

    private final static Map<String, Class<?>> tableClassMap = new HashMap<>(); 

    @Autowired 
    private DaoApi<T, K> daoApi; 

    static { 
     addEntryTableClassMap(Keyboard.class); 
    } 

    @RequestMapping(value = "/api/db/{tableName}/{id}", method = RequestMethod.GET) 
    public Response getById(@PathVariable(value = "tableName") String tableName, @PathVariable(value = "id") Integer id) { 
     ResponseBuilder responseBuilder; 
     T entity = (T) daoApi.findById((Class<T>) getClassFromTableClassMap(tableName), id); 
     if (entity != null) { 
      responseBuilder = Response.ok(entity); 
     } else { 
      responseBuilder = Response.status(Status.NOT_FOUND); 
     } 
     return responseBuilder.build(); 
    } 

    private static <C> void addEntryTableClassMap(Class<C> clazz) { 
     tableClassMap.put(clazz.getSimpleName().toLowerCase(), clazz); 
    } 

    private static <C> Class<C> getClassFromTableClassMap(String tableName) { 
     return (Class<C>) tableClassMap.get(tableName.toLowerCase()); 
    } 
} 

Keyboard.java:

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

import org.springframework.transaction.annotation.Transactional; 

@Transactional 
@Entity 
@Table(name = "keyboard") 
public class Keyboard { 

    @Id 
    @Column(updatable = false) 
    private int id; 
    private String language; 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getLanguage() { 
     return language; 
    } 
    public void setLanguage(String language) { 
     this.language = language; 
    } 
} 

DaoApi.java:

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

@Component 
public class DaoApi<T, K> { 

    @Autowired 
    SessionFactory sessionFactory; 

    public T findById(Class<T> clazz, Integer id) { 

     Session session = sessionFactory.openSession(); 
     T t = (T) session.get(clazz, id); 
     session.close(); 
     return t; 
    } 
} 
+0

Warum ändern Sie nicht die Methodenrückgabe zu T? –

+0

Vielen Dank! Ich habe es irgendwie vermisst. Wenn die Rückgabetypen zu T wechseln, habe ich das Ergebnis erhalten. – gusftaft

Antwort

0

comment empfangen, die mir geholfen Lösung:

@RequestMapping(value = "/api/db/{tableName}/{id}", method = RequestMethod.GET) 
public T getById(@PathVariable(value = "tableName") String tableName, @PathVariable(value = "id") Integer id) { 
    ResponseBuilder responseBuilder; 
    T entity = (T) daoApi.findById((Class<T>) getClassFromTableClassMap(tableName), id); 
    if (entity != null) { 
     responseBuilder = Response.ok(entity); 
     return (T) responseBuilder.build().getEntity(); 
    } else { 
     responseBuilder = Response.status(Status.NOT_FOUND); 
     //some additional code here 
     return (T) responseBuilder.build(); 
    } 
} 
Verwandte Themen