没有找到接口javax.ws.rs.core.UriInfo的主或单一公共构造函数-也没有找到默认构造函数



我有一个rest控制器

@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的控制器失效。

正如Paul在上面的评论中提到的,遗留代码在控制器代码中混合了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;
}