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;
}
}
Warum ändern Sie nicht die Methodenrückgabe zu T? –
Vielen Dank! Ich habe es irgendwie vermisst. Wenn die Rückgabetypen zu T wechseln, habe ich das Ergebnis erhalten. – gusftaft