【问题标题】:rest service based on Spring return html instead of json基于Spring的rest服务返回html而不是json
【发布时间】:2021-06-06 12:24:52
【问题描述】:

我正在使用 keycloak 和 spring 来获取 rest 服务中的用户列表,但是其余的返回 html 而不是 json 数据。

这里是服务。

import org.keycloak.representations.idm.UserRepresentation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    KeycloakInstance keycloakInstance;

    
    public List<UserRepresentation> loadUsers(String realm) {
        return keycloakInstance.getInstance()
                .realm(realm)
                .users()
                .list();
    }
}

这里是控制器。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.keycloak.representations.idm.UserRepresentation;

import java.util.List;
@RestController
@RequestMapping("/api/admin/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping(value = "", produces="application/json") 
    public List<UserRepresentation> loadUsers() {
        String realm = "abc";
        return userService.loadUsers(realm);
    }
}

知道如何解决这个问题吗?

【问题讨论】:

  • 您确定您的控制器调用正确吗?还是过滤器链将您重定向到其他页面?您可以尝试调试对 loadUsers 方法的调用。如果您的呼叫有效,您应该检查您的类路径中有一个 HttpMessageConverter 类型的 bean,用于媒体类型 application/json。您能否提供有关您的应用程序设置的更多详细信息?
  • @GetMapping(value = "",produces="application/json") 下面添加的@ResponseBody 注解有什么区别?它是否提供了您需要的 JSON?
  • @Ashish 它不是返回 json 而是返回一个 html
  • loadUsers() 方法的空路径似乎导致 Spring 使用保留为默认值的 Controller 参数。使用以下内容设置控制器的默认值:@RequestMapping("/api/admin/users", produces="application/json") 将所有方法设置为返回 json,除非被覆盖。

标签: json spring rest


【解决方案1】:

您需要将路径添加到@GetMapping,这应该可以工作

@ResponseBody
@GetMapping(value = "/api/admin/users", produces="application/json") 
public List<UserRepresentation> loadUsers() {
        String realm = "abc";
        return userService.loadUsers(realm);
}

或使用这种方式

 @GetMapping (value = "/api/admin/users", produces = MediaType.APPLICATION_JSON_VALUE) 

【讨论】:

    【解决方案2】:

    正如@ConstantinKonstantinidis 评论的那样,添加到RequestMapping produces JSON 以应用于您的方法(以及所有方法):

    @RequestMapping(value = "/api/admin/users", produces = MediaType.APPLICATION_JSON_VALUE
    

    在类型级别和方法级别均受支持

    另一种选择是将路径添加到@GetMapping,例如

    @RequestMapping("/api/admin")
    public class UserController {
    
        @GetMapping(value = "/users", produces="application/json") 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2020-06-02
      • 1970-01-01
      • 2018-03-03
      相关资源
      最近更新 更多