【问题标题】:How to post with generated client in micronaut如何在 micronaut 中使用生成的客户端发布
【发布时间】:2019-08-15 18:14:38
【问题描述】:

在 micronaut 中发布到简单的 hello 控制器时出现错误。客户端似乎发布为应用程序/json,但控制器需要文本/纯文本。如何修复客户端以文本/纯文本形式发布?

HelloController.java

@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN)
public Single<String> helloBody(@NotBlank String name, @NotBlank @Body String text) {
    return Single.just(name + "sent: " + text);
}

HelloClient.java

@Post(value = "/helloBody/{name}")
Single<String> helloBody(@NotBlank String name, @NotBlank String body);

HelloControllerTest.java

@Test
void testPost() {
    String body = client.helloBody("John", "message").blockingGet();
    assertThat(body).isEqualTo("John sent: message");
}

错误

io.micronaut.http.client.exceptions.HttpClientResponseException: Content Type [application/json] not allowed. Allowed types: [text/plain]
    at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1799)
    at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1739)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
...

【问题讨论】:

  • 更改consumes = MediaType.APPLICATION_JSON 有什么作用吗?我自己不是 100% 熟悉 Spring。
  • 也许尝试将参数produces = MediaType.APPLICATION_JSON 添加到客户端@Post?不确定它是否可以编译,但值得一试
  • 糟糕,produces = MediaType.TEXT_PLAIN
  • @Avi 是 Micronaut,而不是 Spring。但当然非常相似。
  • @saw303 :( 没看到,我的错。幸运的是,还有比我更熟悉 Micronaut 的其他人可以提供很好的答案 ;)

标签: java micronaut


【解决方案1】:

您可以通过告诉客户端按照后端的期望发送text/plain 来更改此设置。

@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_PLAIN)
Single<String> helloBody(@NotBlank String name, @NotBlank String body);

Micronaut 的理念是让 web 操作在控制器和客户端之间共享。

让我们考虑一个名为HelloOperations 的接口。这是您可以在客户端和服务器之间共享的 Web 界面。

@Validated
public interface HelloOperations {

  @Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN)
  Single<String> helloBody(@NotBlank String name, @NotBlank @Body String text);
}

现在您开始在后端使用控制器实现来实现合同,例如

@Controller
public class HelloController implements HelloOperations {

   @Override
   public Single<String> helloBody(String name, String text)  {

     // do something in here...
   }
}

之后您继续在客户端。

@Client
public interface HelloWorldClient extends HelloOperations {

   @Override
   Single<String> helloBody(String name, String text);
}

等等。您已成功连接它们。

可以在https://docs.micronaut.io/latest/guide/index.html#clientAnnotation 的 Micronaut 文档中找到更多解释

【讨论】:

  • 好的,我已经修好了。我必须进行更改并将产品添加到控制器和客户端。 @Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_PLAIN)
  • 查看我的完整示例如何使用 Micronaut 实现出色的客户端/服务器实现
  • 这很好。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多