java - 如何从 spring rest 服务返回 XML 响应?
问题描述
我试图在我的简单 spring rest 服务中返回一个 xml 响应。我使用 spring initializr 启动并创建了一些员工类和一个客户端来发送请求。默认似乎是 JSON 输入和输出,但是当我尝试将其更改为 XML 时,它仍然以 JSON 响应。
我尝试在员工类中添加 XML 注释,以及在 @GetMapping 方法旁边添加 @ResponseBody。我还看到了一些需要添加某种弹簧配置的其他方式,但是 spring initializr 没有包含任何配置文件,只是一个 pom.xml。
EmployeeController.java
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/employees")
public @ResponseBody HashMap<String, Employee> retrieveEmployees() {
return employeeService.retrieveAllEmployees();
}
@GetMapping("/employees/{employeeId}")
public @ResponseBody Employee retrievebyId(@PathVariable String employeeId) {
return employeeService.retrieveEmployee(employeeId);
}
@PostMapping(path="/employees")
public ResponseEntity<Void> registeremployee(@RequestBody Employee newemployee) {
Employee employee = employeeService.addEmployee(newemployee.getId(),newemployee.getName(), newemployee.getDescription());
if (employee == null)
return ResponseEntity.noContent().build();
URI location = ServletUriComponentsBuilder.fromCurrentRequest().path(
"/{id}").buildAndExpand(employee.getId()).toUri();
return ResponseEntity.created(location).build();
}
}
雇员.java
@XmlRootElement (name = "employee")
@XmlAccessorType(XmlAccessType.NONE)
public class Employee implements Serializable {
@XmlAttribute
private String id;
@XmlElement
private String name;
@XmlElement
private String description;
//private List<Team> teams;
public Employee() {
super();
}
public Employee(String id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
//this.teams = teams;
}
@XmlAttribute
public String getId() {
return id;
}
@XmlAttribute
public void setId(String id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getDescription() {
return description;
}
// public List<Team> getTeam() {
// return teams;
// }
@XmlElement
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return String.format(
"employee [id=%s, name=%s, description=%s]", id,
name, description);
}
}
EmployeeService.java
@Component
public class EmployeeService {
static HashMap<String, Employee> employees = new HashMap<>();
static {
//Initialize Data
Team team1 = new Team("t1", "Java team", "Java Dev Team");
Employee Joe = new Employee("employee1", "Joe Smith","Human Resources");
Employee Bob = new Employee("employee2", "Bob Jones",
"Developer");
employees.put("employee1", Joe);
employees.put("employee2", Bob);
}
public HashMap<String, Employee> retrieveAllEmployees() {
return employees;
}
public Employee retrieveEmployee(String employeeId) {
return employees.get(employeeId);
}
//private SecureRandom random = new SecureRandom();
public Employee addEmployee(String id, String name, String description) {
//String randomId = new BigInteger(130, random).toString(32);
Employee employee = new Employee(id, name, description);
employees.put(id, employee);
return employee;
}
}
RestClient.java
public class RestClient {
public static void getJsonEmployee(String id) throws JSONException, IOException {
String uri = "http://localhost:8080/employees/" + id;
RestTemplate restTemplate = new RestTemplate();
// HttpHeaders httpHeaders = restTemplate.headForHeaders(uri);
//
//
// httpHeaders.setContentType(MediaType.APPLICATION_XML);
String result = restTemplate.getForObject(uri, String.class);
System.out.println(result);
}
public static void postJsonEmployee(String id, String name, String description) {
final String uri = "http://localhost:8080/employees/";
Employee newemp = new Employee(id, name, description);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = restTemplate.headForHeaders(uri);
httpHeaders.setContentType(MediaType.APPLICATION_XML);
Employee result = restTemplate.postForObject( uri, newemp, Employee.class);
httpHeaders.setContentType(MediaType.APPLICATION_XML);
}
public static void main(String[] args) throws IOException, JSONException {
System.out.println("GET or POST?");
BufferedReader getpost = new BufferedReader(new InputStreamReader(System.in));
String selection = getpost.readLine();
switch(selection) {
case "GET":
System.out.println("Type in the employee's ID");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String employeeid = reader.readLine();
getJsonEmployee(employeeid);
break;
case "POST":
System.out.println("Type in the employee's ID");
Scanner scan = new Scanner(System.in);
String newid = scan.nextLine();
System.out.println("Type in the employee's name");
String newname = scan.nextLine();
System.out.println("Type in the employee's description");
String newdesc = scan.nextLine();
postJsonEmployee(newid, newname, newdesc);
break;
}
}
结果消息:
13:18:14.726 [main] 调试 org.springframework.web.client.RestTemplate - HTTP GET http://localhost:8080/employees/
13:18:14.737 [main] 调试 org.springframework.web.client.RestTemplate - Accept=[text/plain, application/json, application/*+json, / ]
13:18:14.760 [main] DEBUG org.springframework.web.client.RestTemplate - 响应 200 OK 13:18:14.761 [main] DEBUG org.springframework.web.client.RestTemplate - 读取 [java.lang.String]作为“应用程序/json;charset=UTF-8”
{"employee1":{"id":"employee1","name":"Joe Smith","description":"人力资源"},"employee2":{"id":"employee2","name": "Bob Jones","description":"开发者"}}
解决方案
您需要将映射更新为:
@GetMapping("/employees", produces = MediaType.APPLICATION_XML_VALUE)
getters
另外,请确保您setters
在EmployeeService.java
课堂上公开。
推荐阅读
- javascript - JS API 根据某些参数的值获取数据库项
- mysql - mysql 错误代码:1066。不是唯一的表/别名:'t2'
- javascript - 条件为真时添加数字的逻辑
- jquery - 格式化文本的数据标题中的 HTML 代码
- android - 在按钮单击时过滤 Firebase 数据库返回单个回收视图列表项
- opencv - 通过 OpenCV 查找表格的轮廓
- html - Bootstrap 两列布局图像和文本响应式
- regex - 使用正则表达式查找包含特定内容的标签之间的所有内容
- sql - Separate values of one column into multiple columns based on other column
- matlab - Does the order of inputs matter in MATLAB functions?