首页 > 解决方案 > 如何从 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":"开发者"}}

标签: javaspring

解决方案


您需要将映射更新为:

@GetMapping("/employees", produces = MediaType.APPLICATION_XML_VALUE)

getters另外,请确保您settersEmployeeService.java课堂上公开。


推荐阅读