从websocket调用ControllerLinkBuilder.linkTo时出现以下错误.
java.lang.IllegalStateException: Could not find current request via RequestContextHolder
at org.springframework.util.Assert.state(Assert.java:385)
at org.springframework.hateoas.mvc.ControllerLinkBuilder.getCurrentRequest(ControllerLinkBuilder.java:234)
at org.springframework.hateoas.mvc.ControllerLinkBuilder.getBuilder(ControllerLinkBuilder.java:186)
at org.springframework.hateoas.mvc.ControllerLinkBuilderFactory.linkTo(ControllerLinkBuilderFactory.java:117)
at org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo(ControllerLinkBuilder.java:135)
at urlshortener2014.common.web.UrlShortenerController.createAndSaveIfValid(UrlShortenerController.java:94)
at urlshortener2014.richcarmine.web.UrlShortenerControllerWithLogs.access$200(UrlShortenerControllerWithLogs.java:45)
at urlshortener2014.richcarmine.web.UrlShortenerControllerWithLogs$CreateCallable.call(UrlShortenerControllerWithLogs.java:226)
at urlshortener2014.richcarmine.massiveShortenerNaiveWS.ShortURLWSGenerator.onCall(ShortURLWSGenerator.java:41)
at urlshortener2014.richcarmine.massiveShortenerNaiveWS.ShortURLWSGenerator.onCall(ShortURLWSGenerator.java:15)
at urlshortener2014.richcarmine.massiveShortenerREST.RequestContextAwareCallable.call(RequestContextAwareCallable.java:26)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
整个项目是关于缩短网址,因为我的第一个方法是弹簧websockets我试图通过从任何网址回复缩短的网址来使其工作.
我的TextWebSocketHandler
public class MyHandler extends TextWebSocketHandler {
AtomicLong messageOrder = new AtomicLong(0);
ExecutorService threadPool = Executors.newCachedThreadPool();
CompletionService
这是ShortURLWSGenerator
public class ShortURLWSGenerator extends RequestContextAwareCallableprintstacktrace();
}
CSVContent content = new CSVContent();
content.setorder(order);
content.setShortURL(shortURL);
return content;
}
}
使用RequestContextAwareCallable时,在实现与REST服务相同的功能时解决了同样的问题,在任何情况下,即使使用简单的Callable,我仍然会得到相同的错误.
这是CreateCallable,它只包含main函数
public class CreateCallable implements Callable
最后这里是createAndSaveIfValid,它调用ControllerLinkBuilder.linkTo
protected ShortURL createAndSaveIfValid(String url,String sponsor,String brand,String owner,String ip) {
UrlValidator urlValidator = new UrlValidator(new String[] { "http","https" });
if (urlValidator.isValid(url)) {
String id = Hashing.murmur3_32()
.hashString(url,StandardCharsets.UTF_8).toString();
ShortURL su = new ShortURL(id,url,linkTo(
methodon(UrlShortenerController.class).redirectTo(
id,null)).toUri(),new Date(
System.currentTimeMillis()),HttpStatus.TEMPORARY_REDIRECT.value(),true,ip,null);
return shortURLRepository.save(su);
} else {
return null;
}
}
完整的项目可以在here on github找到
>创建一个名为eg的方法createAndSaveIfValidExtended基于createAndSaveIfValid.代码是相同的但是linkTo(methodon(UrlShortenerController.class).redirectTo(id,null)).toUri()被方法createLink(id)替换
>创建方法String createLink(String id).此方法将使用application.properties中定义的属性构建URL(请参阅此处how),其值将在一个字段中注入,该字段表示应用程序将与/ l连接的位置以及“d”的值.
>在CreateCallable中,调用createAndSaveIfValidExtended而不是createAndSaveIfValid
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。