Spring Boot 在Angular中读取Sping Boot 属性

2w3kk1z5  于 2023-05-06  发布在  Spring
关注(0)|答案(2)|浏览(153)

**问题陈述:**Sping Boot 和Angular 8各有一个微服务。Sping Boot 有一个属性文件(application.yaml),如下所示:

url-header: http    
gateway:
   host: envHost:envPort

ui-endpoints:
  get-config-by-id: ${url-header}://${gateway.host}/api/v1/config/id
  save-config: ${url-header}://${gateway.host}/api/v1/config

我们通过在angular代码中对页面加载执行rest调用来获取这些UI端点。

是否有更好的方法直接在angular ts文件中定义端点,或者我们可以在angular中同步spring Boot 属性而不执行rest call?

ryevplcw

ryevplcw1#

可以使用environment.ts(local)或environment.prod.ts(Production)直接在angular ts文件中定义端点

3pvhb19x

3pvhb19x2#

答案很晚,但如果我问了这个问题,我会被忽略,或者有人会投票结束这个问题而不发表评论。
我是这么做的
首先,您需要将以下内容添加到Angular应用程序的index.html文件中:

<script src="appprops.js"></script>

接下来,您需要创建一个Spring MVC端点。

@RestController
public class AppPropsController {

    // or autowire via constructor, doesn't matter
    @Autowired
    private Environment env;

    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("appprops.js")
    public ResponseEntity<?> props() {

        Map<String, String> mapResult = new HashMap<>();
        mapResult.put("spring.prop.whatever", env.getProperty("spring.prop.whatever");

        String jsBody = String.format("window.props = %s", objectMapper.writeValueAsString(mapResult);

        ResponseEntity<?> result = ResponseEntity.ok()
            // gotta do this manually, the Spring MediaType doesn't have an entry for APPLICATION_JAVASCRIPT
            .header("Content-Type","application/javascript")
            .body(jsBody);

        return result;

    }

}

现在,在Angular端引用它看起来像这样:

// gotta use this weird index signature, window['props'] doesn't work
   const props : any = (window as { [key: string]: any})['props'];

这是复杂的,我讨厌它,但它似乎工作。

相关问题