【问题标题】:How do i call a Spring Java method annotated with @Component?如何调用带有 @Component 注释的 Spring Java 方法?
【发布时间】:2022-01-12 14:41:55
【问题描述】:

我的前端由 tomcat 运行,后端处理由 Mule 运行。

举个例子,

HelloWorld.html

<div>
  <button id="btnSayHello" ng-click="sayHello()" data-transalte>Click Me</button>
</div>

HelloWorld.js

$scope.sayHello = function() {
  $http({
    method: 'GET',
    url: $rootScope.serviceUrl + '/triggers/greetings/' + $scope.name
  }).success(function (response) {
    alert("Success");
  }).error(function () {
    alert("Error");
  })
}

MyTriggers.java

@Component
@Path("/triggers")
public class MyTriggers {

  ...

  @GET
  @Produce("text/plain")
  @Path("/greetings/{name}")
  @Consume("text/plain")
  public String sayHello(@PathParam("name") String name) {
    
    log.info("Hello, " + name);
    
    return "SUCCESS";
  }
  
}

greeting.xml

<flow name="greeting">
   <jersey:resources>
       <spring-object bean="MyTriggers"/>
   </jersey:resources>
</flow>

我的结果一直以错误的形式返回,这意味着它在 JavaScript 级别失败。

不太清楚出了什么问题。

Tomcat 在 localhost:8080 上运行。

【问题讨论】:

  • 看起来您使用 JAX-RS 注释。如果你想这样做,你需要额外的依赖(就像这里的答案中描述的那样:stackoverflow.com/questions/42944777/…
  • 请分享确切的 Mule 版本和 Mule XML 流程。
  • 也分享一下注解的包我是你的Java代码。
  • @aled 是的,我删除了我的答案,我脑子里有春天。
  • 请不要对文本错误使用屏幕截图。请参阅meta.stackoverflow.com/questions/285551/… 的说明。此外,如果您在浏览器中看到错误,您还应该查看服务器端的日志。

标签: java angularjs spring mule


【解决方案1】:

我假设您使用的是 Mule 3.x,因为您似乎正在部署 Mule 可部署 zip。您的问题有几个问题。

Mule 不只是自动调用 Spring bean 或方法。您需要有一个调用它的 Mule 流。具体来说,@Component 注解默认情况下对 Mule 没有任何作用。

我从您提到的 Tomcat 中推断,您正在将 Mule 可部署 zip(即 Mule 3 的 Mule 应用程序)部署到 Tomcat 中。这些 zip 文件旨在部署到 Mule 服务器,而不是 Tomcat 服务器。如果没有有关如何打包和部署的更多详细信息,我会认为它不会起作用。如果您尝试在 Tomcat 中进行应用程序的嵌入式部署,您应该按照https://docs.mulesoft.com/mule-runtime/3.9/deploying-mule-as-a-service-to-tomcat 的说明进行操作。我不推荐使用这种方法。这是一种遗留方法,令人困惑,并且不支持 Mule 的许多组件。

Java 方法中的其他注释似乎是 JAX-RS 注释。这在 Jersey 模块中由 Mule 支持。不过,它应该在流程中有一些东西可以调用。

例子:

  <flow name="HelloWorld">
     <http:listener config-ref="HTTP_Listener_Configuration" path="/*" doc:name="HTTP"/>
     <jersey:resources>
         <component class="com.mycompany.jersey.HelloWorldResource"/>
     </jersey:resources>
  </flow>

Java端:

package com.mycompany.jersey;

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.PathParam;

@Path("/helloworld")
public class HelloWorldResource {

    @POST
    @Produces("text/plain")
    @Path("/{name}")
    public String sayHelloWithUri(@PathParam("name") String name) {
        return "Hello " + name;
    }
}

参考文档:https://docs.mulesoft.com/mule-runtime/3.9/jersey-module-reference

JavaScript/HTML 方面不应该非常相关。它生成的 HTTP 请求是。

【讨论】:

  • 谢谢你,我有这个问题,他们说“元素球衣:这里不允许使用资源”。你知道为什么吗?
  • 请分享您当前的流程和完整的错误信息。
  • 我的流程和上面一样,但是我添加了一个.xml来部署webservice(如上所示)
  • 看起来您从流中删除了消息源。这是触发流执行开始的组件。 Jersey 组件不是消息源。在我的示例中,它是一个 HTTP 侦听器,但是如果您仍在部署到 Tomcat(我不建议这样做),那么 HTTP 侦听器将无法工作,您需要改为使用 Servlet 连接器进行调查。
猜你喜欢
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多