[英]Error No primary or default constructor found for interface javax.ws.rs.core.SecurityContext
[英]No primary or single public constructor found for interface javax.ws.rs.core.UriInfo - and no default constructor found either
我有一个休息控制器
@RestController
@RequestMapping(APIConstants.API_BASE_URI + APIConstants.MYCONTROLLER)
public class MyController extends APIRESTResource {
@Context
UriInfo uriInfo;
@GetMapping({"/activate"})
public ResponseEntity<String> activateAccount(@PathVariable("service") String srvc, @Context UriInfo info) {
HttpStatus status = HttpStatus.OK;
MediaType type = MediaType.TEXT_PLAIN;
String payload = "Activated";
try {
List<Long> accountIdList = extractAccountIdsAsList(info);
String datasource = getDatasourceForService(srvc);
AccountsServiceImpl mgr = new AccountsServiceImpl(datasource);
mgr.activateAccounts(accIdList);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(type);
return new ResponseEntity<>(payload, headers, status);
}
catch (Exception ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
在哪里
private List<Long> extractAccountIdsAsList(UriInfo info) throws Exception {
String fieldName = "accId";
String accIdStr = info.getQueryParameters().getFirst(fieldName);
validateRequiredField(fieldName, accIdStr);
accIdStr = accIdStr.replace(" ", ""); // remove any spaces...
String[] accIds = null;
if (accIdStr.contains(",")) {
accIds = accIdStr.split("\\,");
}
else {
accIds = new String[1];
accIds[0] = accIdStr;
}
List<Long> accIdList = new ArrayList<Long>();
for (int i = 0; i < accIds.length; i++) {
validateFieldValueType(fieldName, accIds[i], Long.TYPE);
Long accId = new Long(accIds[i]);
accIdList.add(accId);
}
return accIdList;
}
但这将失败并出现错误
没有找到接口 javax.ws.rs.core.UriInfo 的主要或单个公共构造函数 - 也没有找到默认构造函数
甚至没有到达那个控制器。 @GetMapping
的任何其他控制器都可以正常工作,但只有带有@Context
的控制器失败了。
如果您有任何问题,请发布解决方案
正如上面保罗在评论中提到的,遗留代码在控制器代码中混合了 JAX-RS 和 Spring MVC,我不知道它到目前为止是如何工作的(可能是因为在 Java6/7 上运行?)但我的解决方案是使用@RequestParam
而不是@Context
,因为 Spring MVC 中没有URIInfo
的等价物,代码将如下所示:
@RestController
@RequestMapping(APIConstants.API_BASE_URI + APIConstants.MYCONTROLLER)
public class MyController extends APIRESTResource {
@Context
UriInfo uriInfo;
@GetMapping({"/activate"})
public ResponseEntity<String> activateAccount(@PathVariable("service") String srvc, @RequestParam String accId) {
HttpStatus status = HttpStatus.OK;
MediaType type = MediaType.TEXT_PLAIN;
String payload = "Activated";
try {
List<Long> accountIdList = extractAccountIdsAsList(accId);
String datasource = getDatasourceForService(srvc);
AccountsServiceImpl mgr = new AccountsServiceImpl(datasource);
mgr.activateAccounts(accIdList);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(type);
return new ResponseEntity<>(payload, headers, status);
}
catch (Exception ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
在哪里
private List<Long> extractAccountIdsAsList(String accIdStr) throws Exception {
String fieldName = "accId";
validateRequiredField(fieldName, accIdStr);
accIdStr = accIdStr.replace(" ", ""); // remove any spaces...
String[] accIds = null;
if (accIdStr.contains(",")) {
accIds = accIdStr.split("\\,");
}
else {
accIds = new String[1];
accIds[0] = accIdStr;
}
List<Long> accIdList = new ArrayList<Long>();
for (int i = 0; i < accIds.length; i++) {
validateFieldValueType(fieldName, accIds[i], Long.TYPE);
Long accId = new Long(accIds[i]);
accIdList.add(accId);
}
return accIdList;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.